Javascript 找到对象,但未定义文档属性

Javascript 找到对象,但未定义文档属性,javascript,meteor,Javascript,Meteor,我正在用Meteor和Javascript编写一个编程示例,我面临一个奇怪的问题。这是我的代码: Items.allow({ insert: function(userId, doc) { return (userId && doc.owner === userId); }, update: function(userId, docs, fields, modifier) { console.log("------------"); conso

我正在用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.u id和doc.owner的其余部分未定义。这实际上导致更新失败,因为我无法将doc.owner与userId进行比较。

所有的
都做什么?它看起来像是将
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中,而不是在它们的数组中,每个更新都将针对allow/deny

单独运行,因为
.all
在数组或对象上迭代,更新传递给单个
.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;
}

您建议的代码在访问properties.name、.u id和.owner时起作用。.u all允许遍历正在更新的所有文档,例如Items.update({u id:{cY87rAW8g4f92bRY2},{$set:{price:{$20}},{u id:{deddtmgdvpmgdf5b},{$set:{price:{$30});我不完全确定meteor目前是否可以进行批量更新,您必须将每个更新放在一个循环中meteor明确禁止在客户端上进行批量更新,因为@Swadq batch updates/insert在meteor中从未以Alberto希望在客户端和服务器上使用的形式得到支持。我想你的意思是使用任意选择器已经从0.5.8降低到了0.5.8,它不允许在客户端上使用单个选择器更新多个文档是的,这就是我的意思-我不确定在0.5.8之前使用的
allow
规则是如何工作的,所以我假设它将任何更新拆分为单个文档的数组,因此阿尔贝托感到困惑——显然不是!我认为您是对的,不受信任的代码(例如客户端代码,如事件处理程序和浏览器的JavaScript控制台)只能一次修改一个文档,由其_id指定。只有在检查任何适用的允许和拒绝规则后才允许修改。我的代码可以在服务器端工作,但不能在客户端工作。@Alberto您仍然必须在服务器上使用循环来修改多个文档,或者使用批量修改选择器。Node的mongodb驱动程序在稍晚的时候向其他mongodb节点本机函数添加了批插入&它尚未在meteor中实现