【问题标题】:How to send a message from Server to Client in Meteor?如何在 Meteor 中从服务器向客户端发送消息?
【发布时间】:2017-04-07 08:12:45
【问题描述】:

我想从“server/main.js”中的服务器脚本向“client/main.js”中的客户端脚本发送消息。

我用 Publish/Subscribe 尝试了一些东西,但我一定做错了什么。运行流星服务器的控制台因数以千计的错误消息而变得疯狂。

服务器

Meteor.publish("test", function () {
    this.ready();
    return 'some test';
  });

客户

Template.panel.onCreated(function loginOnCreated() {
  Tracker.autorun(function () {
    const handle = Meteor.subscribe('test');
    if(handle.ready()){
      alert('Done')
    }
  });
});

无论如何,我需要一个服务器方法在客户端准备好时调用它。

原因:Template.panel.onCreated 无法从 Mongodb 查询数据。它必须等待几秒钟。所以我想做的事情在客户端的 Template.panel.onCreated 中是不可能的。它必须等到 Mongo 准备好。

我该怎么做?

【问题讨论】:

  • 服务器控制台的错误信息是什么?

标签: javascript mongodb meteor meteor-blaze


【解决方案1】:

您可以通过更新数据库来做到这一点,客户端辅助方法会提醒它服务器想要说些什么,或者您可以使用这样的包:

https://atmospherejs.com/raix/eventddp

它允许服务器发起消息传递。我没试过,但它来自一个很好的来源

【讨论】:

    【解决方案2】:

    你应该把Meteor.subscribe放在Tracker.autorun之外。

    我认为问题是因为handle是一个反应数据源,所以当它改变Tracker.autorun内部的函数重新运行时,它再次订阅服务器,一个新的句柄被创建并且新的句柄导致该函数再次运行。这会一遍又一遍地循环并向您的控制台抛出许多错误消息

    【讨论】:

      【解决方案3】:

      它必须等待几秒钟。

      我假设您从 Mongo 检索的数据对于 dom 人口是必要的。 对于任何等待过程,您都可以使用 loader。您可以通过设置一个“假”的助手来做到这一点,直到您没有得到服务器的响应。当您收到该响应时,填充 dom 并将该字段设置为 true。

      类似:

      {{#if dataLoaded}}
        {{domYouWantToPopulate}}
      {{else}}
        {{spinner}} //your loading icon template
      {{/if}}
      

      或者即使您不需要为 dom 提供数据,但仍在加载图标以阻止用户执行某些操作,直到收到数据。

      所以看到的事情是,假设您在开发中,您只有客户端,但在实际场景中,您将拥有一台服务器和许多客户端。因此,从处理和可行性指标来看,从服务器调用每个客户端的客户端函数都是错误的。这就是我们有 API 来从服务器获取响应的原因,因此服务器只能向已命中该 API 的客户端发送响应。

      【讨论】:

        猜你喜欢
        • 2013-06-24
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 2022-07-15
        • 2016-09-10
        • 2015-01-05
        相关资源
        最近更新 更多