我在客户端有这段代码:
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
答案 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提供了正确的实现。