我尝试使用async
的{{1}}方法将一些数据插入到我的MongoDB集合中,以确保所有内容都以正确的顺序完成。最初我的数据以错误的顺序插入到MongoDB中,过了一段时间我才意识到是因为我的waterfall
是异步运行的,所以我无法保证数据会保存在正确的顺序。
所以这是我的insert
:
async.waterfall
因此,在瀑布中的最后一个函数中,我已将async.waterfall([
function(callback) {
request.get(apiUrl, function(error, response, body) {
if (!error && response.statusCode == 200) {
data = JSON.parse(body);
callback(error, data.items);
}
});
},
function(data, callback) {
removeInvalidItems(data);
var items = convertToObj(data);
callback(null, items);
},
function(items, callback) {
console.log(items);
// Insert to collection here
}
], function (err, result) {
// do something here
});
记录到控制台,并且它以正确的顺序显示数据。所以现在,我需要做的就是将数据插入到我的集合中,并在回调中关闭连接并从瀑布移出到最终items
。够容易吧?嗯,这就是我现在正在尝试的:
function
MongoClient.connect(config.db, function(err, db) {
if (err) {
console.log(err);
} else {
console.log("Connected correctly to server");
db.collection('items').insert(items, function(err, result) {
if (err) {
console.log(err);
}
db.close();
callback(null, 'done');
});
}
});
和db.close()
应该关闭连接并在收到回调后离开瀑布。但我似乎得到的只是callback(null, 'done')
。我已经尝试了所有我能想到的东西,但是我无法通过回调来移动这个插件并移出瀑布。
有人可以帮忙吗?
答案 0 :(得分:1)
此商品系列的尺寸是多少?它可以超过callstack大小吗?要运行当前大小:
node --v8-options | grep -B0 -A1 stack_size
默认大小为492 kB(对于32位)和984 kB(对于64位)。
要增加callstack大小,请尝试使用参数:
启动节点node --max-stack-size={your-desired-size-in-bytes}
考虑到节点可能没有时间清除每个瀑布回调之间的callstack。尝试在nextTick上运行回调:
async.waterfall([
function(callback) {
request.get(apiUrl, function(error, response, body) {
if (!error && response.statusCode == 200) {
data = JSON.parse(body);
callback(error, data.items);
}
});
},
function(data, callback) {
removeInvalidItems(data);
var items = convertToObj(data);
process.nextTick(function() { // callback on next tick
callback(null, items);
});
},
function(items, callback) {
console.log(items);
// Insert to collection here
}
], function (err, result) {
// do something here
});
答案 1 :(得分:0)
我找到了自己的问题here的答案。问题是,当我将数据批量插入MongoDB时,我收到了Maximum call stack size exceeded
错误。根据名为db.collection('something').insert(data, function()....
的Mongoose Schema,我在运行Users
时使用的数据数组是User
数组,因此此data
数组中的每个项目都创建为{ {1}}。显然,MongoDB不喜欢这个。我认为这将是在生产中插入数据的正确方法,这就是我将如何使用数据(使用var item = new User({});
个对象)。
要解决此问题,我只需将User
替换为var item = new User({})
,以便我只是创建一个新的JavaScript对象。这工作正常,并以正确的顺序将数据插入数据库,没有错误。感谢那些写下其他答案的人,我已经用它来修复和改进我的回调!