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コレクションの1つのオブジェクトを更新しようとすると

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ますか?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;
}

collection.allowでは、updateがそれらの配列ではなく単一のドキュメントを処理するため、私も変更docsしました。各更新は、allow/denyに対して個別に実行されます。doc

于 2013-03-24T09:47:41.890 に答える
1

配列またはオブジェクトを反復処理し、更新に単一のドキュメント_.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;
}
于 2013-03-24T10:05:59.560 に答える