0

マングースは奇妙な行動を示します。次のコード行は、最初にコレクションを完全に削除し、次に新しいオブジェクトを作成し、最後にコレクションを再度削除します。

Model.remove().exec();
var obj = new Model({ name: 'my object' });
obj.save();
Model.remove().exec();

最初の削除は機能しますが (プログラムを起動するたびにコレクションが空になります)、2 番目の削除は効果がありません (コレクションを照会すると、オブジェクトはまだ存在します)。ここで何が起こっているのか理解できません。

環境: Node.js v0.8.20、MongoDB v1.2.14、Mongoose v3.6.0

4

2 に答える 2

5

シリアル操作を取得するには、コールバックを使用する必要があります。node.js のすべての I/O は非同期です。これが意味することは、おそらく.save()よりも遅い.remove().exec()ため、2 番目.remove().exec()が完了してから保存が行われるということです。適切なフロー制御を行うには、コールバック関数を使用する必要があります。深くネストされたコールバック (別名コールバック ヘル) の方法は次のようになりますが、より名前の付いた関数または async.js のようなフロー制御ライブラリを使用すると、それが解決されます。

Model.remove().exec(function (error) {
    var obj = new Model({ name: 'my object' });
    obj.save(function (error) {
        Model.remove().exec();
    });
});

そこにもエラー処理を自由に投げ込んでください。

于 2013-03-27T23:29:47.800 に答える
2

テストの最後に実行されるこのコードがあります。

var clearDb = function (){ // Reset collections ProjectModel.remove().exec() .then(function() { console.log('Removed collection: Project'); }); };

ただし、コレクションをクリアしていません!別のモデルである別のテストケースで動作し、動作します! 何か案は?ログ見れます

于 2015-01-13T09:52:50.577 に答える