【问题标题】:Meteor (Iron Router subscriptions): handling server errors with waitOnMeteor(Iron Router 订阅):使用 waitOn 处理服务器错误
【发布时间】:2018-07-12 21:29:00
【问题描述】:

如果我的用户偶然发现没有数据库匹配的页面,我会尝试将他们重定向到 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}),
]

});

一切都很好,除了当有人访问没有匹配 Car 的页面时 waitOn 挂起(即 :slug 与数据库中的任何内容都不匹配)

示例服务器错误:

来自子车 id CTusRZSAPqJaK9ws3 类型错误的异常:无法读取 未定义的属性“_id”

我已经尝试了各种博客/帖子中推荐的各种事情,但仍然不确定在涉及 waitOn 时如何处理此类服务器错误。

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

【问题讨论】:

    标签: mongodb meteor iron-router meteor-blaze


    【解决方案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 包。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多