如果他们偶然发现没有数据库匹配的页面,我试图将我的用户重定向到404页面(甚至回家)。
我的waitOn代码(在Iron Router Route内)
waitOn: function(){
return Meteor.subscribe('cars', this.params.slug);
},
我的发布方法:
Meteor.publish("cars", function (slug) {
var selectedCar = Cars.findOne({slug: slug})._id;
return [
Cars.find({ _id: selectedCar}),
Parts.find({carid: selectedCar}),
]
});
一切都很好,除非waitOn在有人访问没有匹配Car的页面时挂起(即:slug与数据库中的任何内容都不匹配)
示例服务器错误:
子车ID异常CTusRZSAPqJaK9ws3 TypeError:无法读取 属性'_id'未定义
我已尝试过各种博客/帖子推荐的各种内容,但在涉及waitOn时仍不确定如何处理此类服务器错误。
是否有人能够在订阅中处理此类错误?
答案 0 :(得分:1)
在您当前的代码中,您没有处理 findOne 方法可能会返回未定义的情况。
请修改您的出版物:
Meteor.publish("cars", function (slug) {
var selectedCar = Cars.findOne({slug: slug});
if (selectedCar) {
return [
Cars.find({ _id: selectedCar._id}),
Parts.find({carid: selectedCar._id}),
]
}
this.ready()
});
如果 findOne 返回undefined
结果,则在上面的代码中,我们正在调用this.ready()
方法,该方法会将订阅设置为准备好。
在客户端,如果您没有收到订阅中的任何数据,则可以显示404消息(找不到项目)。
此外,您应该在查询之前验证slug。只是为了避免任何nosql
注射。为此你可以使用check
包。