使用 findone 自动运行跟踪器

Tracker autorun using findone

我在客户端有这段代码:

Tracker.autorun(function () {
    if (params && params._id) {
        const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
        if (dept) {
        }
    }
});

params 将被传递到 url。因此,最初我们没有部门数据,findOne 方法将为 return null,然后稍后,当数据到达时,我们可以找到部门对象。

但是如果用户输入了无效的id,我们需要return他们404。使用跟踪器自动运行,我如何区分2种情况:

一个。数据还没有,所以 findOne returns null

b。没有这样的数据,即使在服务器的mongodb中,所以findOne也会returns null.

对于情况 a,跟踪器自动运行将正常工作,但对于情况 b,我需要知道 return 404

我建议您订阅模板内的数据,如下所示,这样您就可以知道订阅何时准备就绪,然后您可以检查数据是否存在

Template.myTemplate.onCreated(function onCreated() {
  const self = this;
  const id = FlowRouter.getParam('_id');
  self.subscribe('department', id);
});


Template.myTemplate.onRendered(function onRendered() {
  const self = this;
  // this will run after subscribe completes sending records to client
  if (self.subscriptionsReady()) {
    const id = FlowRouter.getParam('_id');
    const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
    if (dept) {
      // found data in db
    } else {
      // 404 - no department found in db

    }
  }
});

如果您使用的是 Iron-Router,您可以试试这个 hack。

Router.route('/stores', function() {
    this.render('stores', {});
}, {
    waitOn: function() {
        return [
            Meteor.subscribe('stores_db')
        ];
    }
});

上面的示例代码将等待订阅 "stores_db" 完成,然后再呈现任何内容。然后您可以毫无问题地使用您的 findOne 逻辑,确保所有文档都可用。这适合你的情况。

这是我在完全理解 MeteorJS 发布和订阅之前所做的。我不推荐我的解决方案,这对用户体验非常糟糕。在下载文档时,用户将永远看到页面加载。 @Sasikanth 给出了正确的实现。