0

我正在使用 Meteor 和 Javascript 编写一个编程示例,但遇到了一个奇怪的问题。这是我的代码:

Items.allow({
  insert: function(userId, doc) {
    return (userId && doc.owner === userId);
  },
  update: function(userId, docs, fields, modifier) {
    console.log("------------");
    console.log(docs);
    return _.all(docs, function(doc) {
      console.log(doc);
      console.log(doc.name);
      console.log(doc._id);
      console.log(doc.owner);
      console.log(userId);
      return doc.owner === userId;
    });
  }
});

当我尝试使用 Javascript 控制台更新 Items 集合的一个对象时

Items.update({_id: "cY87rAW8g4f92bRY2"}, {$set: {price: "$20"}}); 

我在控制台中看到以下内容:

------------
{ name: 'two',
  owner: 'ZGXiBDBR6J5XdTHSe',
  _id: 'cY87rAW8g4f92bRY2' }
two
undefined
undefined
undefined
ZGXiBDBR6J5XdTHSe

第一次登录控制台“console.log(doc);” 表明我正在更新正确的项目,但控制台日志 doc.name、doc._id 和 doc.owner 的其余部分未定义。这实际上会导致更新失败,因为我无法将 doc.owner 与 userId 进行比较。

4

2 回答 2

1

由于_.all迭代了一个数组或对象,并且 update 传递了一个文档,_.all因此迭代了该文档的属性。

所以什么时候two输出,那是console.log(doc)行的结果。未定义的输出是您尝试记录属性本身的属性。

因此,将_.all包装器移除到块中,你会没事的:

update: function(userId, doc, fields, modifier) {
  console.log(doc);
  console.log(doc.name);
  console.log(doc._id);
  console.log(doc.owner);
  console.log(userId);
  return doc.owner === userId;
}
于 2013-03-24T10:05:59.560 回答
1

做什么的_.all?看起来它的设置name是 的根元素doc,它没有任何键,因此它返回未定义。没有它,您的代码应该可以正常工作:

update: function(userId, doc, fields, modifier) {
    console.log(doc);
    console.log(doc.name);
    console.log(doc._id);
    console.log(doc.owner);
    console.log(userId);
    return doc.owner === userId;
}

我也更改docs为,doc因为在 collection.allow 中,更新处理单个文档,而不是它们的数组,每个更新都将单独针对允许/拒绝运行

于 2013-03-24T09:47:41.890 回答