使用Findone进行跟踪器自动运行

时间:2018-06-28 15:22:32

标签: meteor

我在客户端有这段代码:

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

参数将传递到url中。因此,最初我们将没有部门数据,并且findOne方法将返回null,然后,当数据到达时,我们可以找到部门对象。

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

a。数据还不存在,所以findOne返回null

b。即使在服务器的mongodb中也没有此类数据,因此findOne还将返回null。

对于情况a,跟踪器自动运行会很好,但是对于情况b,我需要知道返回404

2 个答案:

答案 0 :(得分:2)

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

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

    }
  }
});

答案 1 :(得分:0)

如果您使用的是Iron-Router,则可以尝试使用此技巧。

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

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

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