Meteor(铁路由器订阅):使用waitOn

时间:2018-02-02 11:25:08

标签: mongodb meteor iron-router meteor-blaze

如果他们偶然发现没有数据库匹配的页面,我试图将我的用户重定向到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时仍不确定如何处理此类服务器错误。

是否有人能够在订阅中处理此类错误?

1 个答案:

答案 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包。