Meteor(Iron Router 订阅):使用 waitOn 处理服务器错误

Meteor (Iron Router subscriptions): handling server errors with waitOn

如果我的用户偶然发现没有数据库匹配的页面,我会尝试将他们重定向到 404 页面(甚至首页)。

我的 waitOn 代码(在 Iron Router 路由内)

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 与数据库中的任何内容都不匹配)

示例服务器错误:

Exception from sub cars id CTusRZSAPqJaK9ws3 TypeError: Cannot read property '_id' of undefined

我已经尝试了各种 blogs/posts 上推荐的各种方法,但仍然不确定在涉及 waitOn 时如何处理此类服务器错误。

有没有人能够处理订阅中的此类错误?

在您当前的代码中,您没有处理 findOne 方法可能 return 未定义的情况。

请修改您的发布:

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 return 是 undefined 结果,我们将调用 this.ready() 方法来设置订阅.

在客户端,如果您没有收到订阅中的任何数据,您可以显示 404 消息(未找到项目)。

您还应该在查询之前验证 slug。只是为了避免任何 nosql 注入。为此,您可以使用 check 包。