我有一個種子文件設置來填充我的mongodb。我正在設置一個計數器,這樣我可以在向數據庫添加新配方時自動增加一個值。現在我正在使用async.series在種子文件中運行不同的任務。在我所包含的內容中,您可以看到我設置的recipe_id等於此方法的返回值getNextSequence(計數器,「recipeid」)如何等待findOneAndUpdate完成後再繼續async.series
getNextSequence使用Counter模型來查詢(findOneAndUpdate)db。我相信findOneAndUpdate的回調從來不會被調用,因爲首先調用了async.series的回調函數。這是一個有趣的問題,因爲我需要確保getNextSequence在繼續前成功返回。不確定最好的方式去做這件事。
//seed.js //不全
var getNextSequence = require('./utils/getNextSequence').getNextSequence;
recipes = new mongo.Collection(db, "recipes");
counters = new mongo.Collection(db, "counters");
async.series([
function(callback){
//initiate counter
counters.insert(
{
_id: "recipeid",
seq: 0
},function(err, rec){
callback(err, rec);
})
},
function(callback){
//add test recipes
recipes.insert([{
recipe_id: getNextSequence(counters, "recipeid"),
title:'title 1',
body:'body 1',
author: [seedUsers[1]._id],
categories: [ seedCategories[0]._id, seedCategories[1]._id ],
create_at: new Date()
},{
recipe_id: getNextSequence(counters, "recipeid"),
title:'title 2',
body:'body 2',
author: [seedUsers[1]._id],
categories: [ seedCategories[1]._id ],
create_at: new Date()
}], function(err, rec){
callback(err, rec);
})
}
],
// optional callback
function(err, results){
//console.log('\n', results);
db.close();
});
//getNextSequence.js
var Counter = require('../counter').Counter;
exports.getNextSequence = function(counters, name) {
Counter.findOne({ '_id': 'recipeid' }, function (err, counter) {
//if (err) return handleError(err);
//never called
console.log('---counter seq=', counter.seq);
})
Counter.findOneAndUpdate({ _id: name }, { $inc: { seq: 1 } }, { new: true }, function(err, counter){
//never called
console.log('counter.seq', counter.seq);
return counter.seq;
}
)
}
我用你的瀑布和檢修我的代碼。這是一團糟,但它現在正在工作。謝謝! – captainill 2015-01-10 05:55:22