我正在使用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进行比较。
答案 0 :(得分:1)
_.all
做了什么?看起来它设置name
作为doc
的根元素,它没有任何键,因此返回undefined。没有它你的代码应该可以正常工作:
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,update handles a single document中,而不是其中的数组,每个更新都将分别针对allow / deny运行
答案 1 :(得分:1)
由于_.all
遍历数组或对象,并且更新传递了单个 doc,_.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;
}