【问题标题】:Object found but document properties undefined找到对象但未定义文档属性
【发布时间】:2013-03-24 09:26:17
【问题描述】:

我正在使用 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 进行比较。

【问题讨论】:

    标签: javascript meteor


    【解决方案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;
    }
    

    【讨论】:

    • 我认为你是对的,不受信任的代码(例如,事件处理程序和浏览器的 JavaScript 控制台等客户端代码)一次只能修改一个由其 _id 指定的文档。只有在检查任何适用的允许和拒绝规则后才允许修改。我的代码可以在服务器端运行,但不能在客户端运行。
    • @Alberto 您仍然必须在服务器上使用循环来修改多个文档或使用批量修改选择器。 Node 的 mongodb 驱动程序稍后将批量插入添加到其他 mongodb 节点本机函数中,并且尚未在流星中实现
    【解决方案2】:

    _.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 中update handles a single document,而不是它们的数组,每个更新都将单独运行允许/拒绝

    【讨论】:

    • 您建议的代码适用于访问属性 .name、._id 和 .owner。 ._all 允许遍历所有正在更新的文档,例如Items.update({_id: "cY87rAW8g4f92bRY2"}, {$set: {price: "$20"}}, {_id: "DEDdTMgdvpmGDFF5b"}, {$set: {price: "$30"}});
    • 我现在不完全确定流星可以批量更新,你必须把每个都放在一个循环中
    • Meteor 从0.5.8起明确禁止客户端批量更新
    • @Swadq 批量更新/插入在 Meteor 中从未以 Alberto 希望在客户端和服务器上使用的形式支持。我认为您的意思是使用任意选择器已从 0.5.8 开始贬值,这不允许在客户端上使用单个选择器更新多个文档
    • 啊,是的,这就是我的意思——我不确定 allow 规则在 0.5.8 之前是如何工作的,所以我假设它将任何更新拆分为单个文档的数组,因此 Alberto 的混乱 - 显然不是!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2021-08-27
    • 1970-01-01
    • 2016-08-03
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多