3

最近出版されたIsaacStrackの著書「GettingStartedwithMeteor.jsJavaScriptFramework」をフォローしています。この本はMeteor0.5.0で動作します。私はバージョン0.5.4で作業しています。

この本では、家財を追跡するためのデータを挿入するいくつかのカテゴリと、それらが誰に貸し出されるかを示すアプリを作成します。アプリをmeteorサブドメインにデプロイしましたが、完全に機能しています。ローカルのMongoDBエラーを複製しません。

LendLib

私は第5章にいますが、アプリから自動公開を削除し、データのローカルチャネルを指定しました。

ローカルでは、[ツール]カテゴリの下でのみ、カテゴリに新しいアイテムを追加しようとすると、ブラウザコンソールで次のエラーが発生します。

Exception while simulating the effect of invoking '/Lists/update' Error {} Error: Cannot apply $addToSet modifier to non-array
    at Error (<anonymous>)
    at LocalCollection._modifiers.$addToSet (http://localhost:3000/packages/minimongo/modify.js?e7f02f0df0bff9f0b97236f9548637b7ede1ac74:178:13)
    at Function.LocalCollection._modify (http://localhost:3000/packages/minimongo/modify.js?e7f02f0df0bff9f0b97236f9548637b7ede1ac74:53:9)
    at LocalCollection._modifyAndNotify (http://localhost:3000/packages/minimongo/minimongo.js?7f5131f0f3d86c8269a6e6db0e2467e28eff6422:474:19)
    at LocalCollection.update (http://localhost:3000/packages/minimongo/minimongo.js?7f5131f0f3d86c8269a6e6db0e2467e28eff6422:444:12)
    at m.(anonymous function) (http://localhost:3000/packages/mongo-livedata/collection.js?3ef9efcb8726ddf54f58384b2d8f226aaec8fd53:415:36)
    at http://localhost:3000/packages/livedata/livedata_connection.js?367884963b120d457819216ff713b2586b266dde:540:25
    at _.extend.withValue (http://localhost:3000/packages/meteor/dynamics_browser.js?46b8d1f1158040fcc2beb7906ec2f932871a398d:21:19)
    at _.extend.apply (http://localhost:3000/packages/livedata/livedata_connection.js?367884963b120d457819216ff713b2586b266dde:539:47)
    at Meteor.Collection.(anonymous function) [as update] (http://localhost:3000/packages/mongo-livedata/collection.js?3ef9efcb8726ddf54f58384b2d8f226aaec8fd53:266:23) logging.js:30
update failed: Internal server error logging.js:30

ツールカテゴリには、チュートリアルの前半で送信された1つのアイテムがすでに含まれています。コンソールlists.findOne({Category:"Tools"});に入力すると、オブジェクト内のアイテムを認識する出力が得られます。

Object
  Category: "Tools"
  _id: "eaa681e1-83f2-49f2-a42b-c6d84e526270"
    items: Object
      LentTo: "Steve"
      Name: "Linear Compression Wrench"
      Owner: "me"
      __proto__: Object
  __proto__: Object

ただし、画面出力は空白です。

ここに画像の説明を入力してください

当然、meteorサーバーを再起動してブラウザをシャットダウンしようとしましたが、解決できませんでした。私はMongoDBを初めて使用するため、この問題の原因とその理由を理解するためにどこを向いたらよいかわかりません。

あなたはここでアプリを見ることができます。あなたは私のGitHubでコードを見ることができます。

4

2 に答える 2

11
function addItem(list_id, item_name) {
    if(!item_name && !list_id)
      return;
    lists.update({_id:list_id}, {$addToSet:{items:{Name:item_name}}});
  }

セットにオブジェクトを追加しようとしているようです。シミュレーションでエラーが発生します。そのエラーを調べてみましょう。エラーが発生するコード:

https://github.com/meteor/meteor/blob/master/packages/minimongo/modify.js

 $addToSet: function (target, field, arg) {
    var x = target[field];
    if (x === undefined)
      target[field] = [arg];
    else if (!(x instanceof Array))
      throw Error("Cannot apply $addToSet modifier to non-array");
    else { ...

ええと、throw Error("Cannot apply $addToSet modifier to non-array.")

あなたのコードを見てください:

Object
  Category: "Tools"
  _id: "eaa681e1-83f2-49f2-a42b-c6d84e526270"
...
  items: Object
...

itemsはオブジェクトであり、配列ではありません!エラーになります。

$addToSetモンゴでオブジェクトにできますか?コードを見てみましょう。

https://github.com/mongodb/mongo/blob/4a4f9b1d6dc79d1ba4a7d7eaa9e4eb6d00aa466c/db/update.cpp

 case ADDTOSET: {
            uassert( 12592 ,  "$addToSet can only be applied to an array" , in.type() == Array );
            ...
        }

いいえ!現代のコードベースは広大であるため、これは古いMongoコードからのものですが、同じことです。

insert私はあなたのコードで1つだけ見つけました。

'keyup #add-category': function(e, t) {
  if (e.which === 13) {
    var catVal = String(e.target.value || "");
    if (catVal) {
      lists.insert({Category:catVal});
      Session.set('adding_category', false);
    }
  }
},

試してみてくださいlists.insert({Category:catVal,items:[]})。そのため、アイテムは、最初に使用されたときにオブジェクトではなく配列として初期化されます。

$addToSetまた、とにかく配列内のオブジェクトを希望どおりに比較するとは思わないのでItems、を含む別のコレクションを作成することを検討してcategoryIdください。

それが別の場所ではなく、ある場所で機能しているのはまったくの偶然です。

于 2013-01-22T16:57:36.920 に答える
2

同じガイドに従って同じ問題が発生しました。ガイド(ツールとDVD)から直接インサートを使用する場合、minimongoはアイテムを配列ではなくオブジェクトとして挿入します。それが単なる間違いだったのか、コードベースが変更されたのかはわかりません。どちらの方法でも変更しました。

lists.insert({Category:"DVDs", items: {Name:"Mission Impossible", Owner:"me", LentTo:"Alice"}});

lists.insert({Category:"DVDs", items: [{Name:"Mission Impossible", Owner:"me",LentTo:"Alice"}]});

アイテムを[]に入れて配列に強制するだけで、ツールのインサートでも同様に実行できます。今はうまくいきます。

于 2013-04-02T14:38:46.300 に答える