奇怪的mongoose行为 – 文件不会保存到数据库中

在下面的代码中,我尝试用一​​些testing数据填充我的开发数据库。 我想先删除所有文件,然后添加新的testing文件:

var mongoose = require('mongoose') , Plan = mongoose.model('Plan') , Async = require('async') Async.series([ function(callback){ // delete all records Plan.find(function(err,docs){ for (d in docs) Plan.remove(d, function(err) { if (err) console.log("error removing records " + err) }); }); callback(); }, function(callback){ var planArray = [ {title: 'Plan A', body: 'Restaurant Financial Plan'}, {title: 'Plan B', body: 'Coffeeshop Financial Plan'}, {title: 'Plan C', body: 'bar Financial Plan'} ] var arrayLength = planArray.length; for (var i = 0; i < arrayLength; i++) { var p = new Plan(planArray[i]) p.save(function(err, saved){ if (err) {console.log("error creating fixture " + err)} else { console.log(saved) } }) } callback(); } ]) 

有趣的(奇怪的)行为是: – 代码运行并删除所有文档,但不添加新的testing。 – 在控制台上没有错误,console.log(保存)成功地将每个新文档打印到控制台。 – 如果我删除第一个asynchronousfunction(删除所有logging) – 然后新的文档被保存到数据库。

mongoose怪癖或者我对asynchronousstream程的误解。

我的猜测是后者 – 对asynchronousstream程的误解。 在完成查找和删除文档之前,调用第一个函数的callback函数。 所以,当你还在find并删除它们时,你已经在第二个函数中增加了一些 – 但是这些将会被第一个find并删除。

只有在删除所有文档后,才需要调用第一个callback函数。 尝试在您的Plan.findcallback中添加一个async.each

 Async.series([ function(callback){ // delete all records Plan.find(function(err, docs){ Async.each( docs, // your array function removeDoc(d, cb) { // iterator function Plan.remove(d, function (err) { if (err) console.log("error removing records " + err); return cb(); }); }, callback // executed after the iterator is done ); }, ... 

顺便说一下,我相信Plan.remove({}, function(err){...})会删除所有文档 – 除非您正在做其他事情,否则无需遍历每个文档。

有几个问题。 首先你有一个for循环是asynchronous删除,但是这些可能不会在你的第一个callback被调用之前完成。 最好使用Async.each来代替。

也似乎有一些function命名碰撞发生。 所以对于这个完整的例子,请看下面的例子:

 var mongoose = require('mongoose'), Async = require('async'), Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); var planSchema = new Schema({ title: String, body: String }); var Plan = mongoose.model('Plan',planSchema); Async.series([ function(call1) { Plan.find(function(err,docs) { if (err) throw err; if ( docs.length > 0 ) { Async.each( docs, function(d, call2) { Plan.remove(d, function(err) { if (err) throw err; console.log( "deleting: " + d ); call2(); }); }); } }); call1(); }, function(call3) { var planArray = [ { title: 'Plan A', body: 'Plan A' }, { title: 'Plan B', body: 'Plan B' } ]; var arrayLength = planArray.length; for ( var i = 0; i < arrayLength; i++ ) { var p = new Plan(planArray[i]); p.save(function(err,saved) { if (err) throw err; console.log( "saving: " + saved ); }); } call3(); } ]); 

在调用callback()之后,即在查找和删除调用之前,第二个函数开始执行。 你必须等到查找和删除完成后再调用callback()。 看一下从asynchronous的队列方法: https : //github.com/caolan/async#queue