node.js,testing一个mongodb保存和加载

也许我只是无法找出callbackyness,但我不能找出一种方法来testingnode.js中的保存和加载。

我的testing是这样的:

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); 

有了这个testing:

 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); }; 

有没有一种方法,我可以传递一个callbacksaveItems的方式, getItems不被调用,直到所有的 mongo保存完成?

尝试这个 :)

 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); }) }); }; 

使用node.js mongo db驱动程序: http : //mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html

插入和更新函数都是用callback来定义的。 我只使用更新函数,因为它也作为插入(如果下面的第一个参数不获取任何logging)。

 itemsCollection.update({_id: itemId}, item, {upsert:true, safe:true}, function (err, result) { // callback here });