2012-01-22 15 views
1

おそらく私はコールバックを理解するのに苦労しているかもしれませんが、node.jsでセーブとロードをテストする方法は分かりません。node.js、mongodbのセーブとロードをテストする

私のテストはこれである:これはテストされていると

vows.describe('Saving').addBatch({ 
    'Single item can be saved':{ 
     topic:function() { 
      myStore.saveItems(1, [{id:3,name:'squat'}]); 
      myStore.getItems(1, this.callback); 
     }, 
     'saved item is returned by getItems':function (err, items) { 
      assert.equal(items.length, 1); 
      assert.equal(items[0].deviceId, 1); 
      assert.equal(items[0].id, 3); 
     } 
    } 
}).export(module); 

exports.saveItems = function (deviceId, items) { 
    var itemsCollection = db.collection('items'); 

    itemsCollection.find({deviceId:deviceId}).toArray(function (err, existingItems) { 
     _.each(items, function (item) { 
      item['deviceId'] = deviceId; 
      var existingItem = _.find(existingItems, function (existingItem) { 
       return existingItem.id === item.id 
      }); 
      if (typeof(existingItem) === 'undefined') { 
       itemsCollection.save(item);//callback here? 
      } else { 
      } 
     }); 
    }); 
}; 

exports.getItems = function (deviceId, callback) { 
    var itemsCollection = db.collection('items'); 
    itemsCollection.find({deviceId:deviceId}).toArray(callback); 
}; 

は私がgetItemsがするまで呼び出されないようにsaveItemsにコールバックを渡すことができる方法がありますすべて mongoセーブは完了ですか?

答えて

2

はこれを試してみてください:)

vows.describe('Saving').addBatch({ 
    'Single item can be saved':{ 
     topic:function() { 
      var topicThis = this; 
      // NEW: having a callback here 
      myStore.saveItems(1, [{id:3,name:'squat'}], function(err, results){ 
       myStore.getItems(1, topicThis.callback);  
      }); 
     }, 
     'saved item is returned by getItems':function (err, items) { 
      assert.equal(items.length, 1); 
      assert.equal(items[0].deviceId, 1); 
      assert.equal(items[0].id, 3); 
     } 
    } 
}).export(module); 

// https://github.com/caolan/async 
var async = require('async'); 
// NEW: having a callback here 
exports.saveItems = function (deviceId, items, cb) { 
    var itemsCollection = db.collection('items'); 

    itemsCollection.find({deviceId:deviceId}).toArray(function (err, existingItems) { 
     var tasks = []; 
     // here you are iterating over each item, doing some work, and then conditionally doing an async op 
     _.each(items, function (item) { 
      item['deviceId'] = deviceId; 
      var existingItem = _.find(existingItems, function (existingItem) { 
       return existingItem.id === item.id 
      }); 
      if (typeof(existingItem) === 'undefined') { 
       // so this is async, b/c it's talking to mongo 
       // NEW: add it to our list of tasks, when are later run in parallel 
       tasks.push(function(nextTask){ 
        itemsCollection.save(item, nextTask); 
       }); 
      } 
     }); 
     // NEW: run it all in parrallel, when done, call back 
     async.parallel(tasks, function(err, results) { 
      cb(err, results); 
     }) 
    }); 
}; 
+1

ハは答えを投稿し、#Node.jsにdtrejoを引用する時間を節約しました。 –

1

ドライバのNode.jsモンゴDBを使用します。挿入および更新機能は、コールバックが定義されている両 http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html

。私は、(最初​​の引数がレコードを取得しないならば)挿入としても機能するので、私はupdate関数を使います。

itemsCollection.update({_id: itemId}, item, {upsert:true, safe:true}, function (err, result) { 
    // callback here 
}); 
関連する問題