流星延迟find()使我可以访问该对象

时间:2016-02-04 09:46:06

标签: mongodb asynchronous meteor

我在Meteor中的模板助手中有一个findOne(),但我想在返回文档和更新的数组之前修改文档中的数组。这样做时我得到TypeError: Cannot read property 'access' of undefined。在最初的测试中,它工作正常,但我怀疑它现在失败了,因为我试图在findOne()完成之前修改文档。我该如何解决这个问题?代码如下:

'curMatter': function() {
var curObj = Matters.findOne({_id:Session.get('editing_matter')});
var curAccess = _.without(curObj.access, Meteor.userId());
return { curMatter: curMatter, curAccess: curAccess };
}

2 个答案:

答案 0 :(得分:1)

Collection.findOne在运行代码之后完成(在您的情况下为var curAccess = _.without(curObj.access, Meteor.userId());)。

问题是,您希望通过此查询获得的文档尚未提供给客户端,因此Matters.findOne({_id:Session.get('editing_matter')});会返回undefined

那么,当第一次运行帮助程序并且失败时,它的实际意味着您的订阅尚未就绪。

您可以做的是在访问其属性之前检查curObj是否不是undefined(例如var curAccess = curObj && _.without(curObj.access, Meteor.userId());

当文档可供客户端使用时,将重新运行帮助程序,然后您将获得正确的结果。

这是您的完整代码:

'curMatter': function() {
    var curObj = Matters.findOne({_id:Session.get('editing_matter')});
    var curAccess = curObj && _.without(curObj.access, Meteor.userId());
    return { curMatter: curMatter, curAccess: curAccess };
}

答案 1 :(得分:0)

只需将它用作光标,无论如何它们似乎总是更好。

Template['someTemplate'].helpers({
  curMatter: function () {
    return Matters.find({
      _id: Session.get('editing_matter')
    }).map(doc => Object.assign(doc, {
      curAccess: _.without(doc.access, Meteor.userId())
    }))
  }
});

然后您可以在模板中使用{{#each}}(即使它始终是一个项目)