【发布时间】:2015-11-20 18:30:47
【问题描述】:
我正在尝试使用async 的waterfall 方法将一些数据插入到我的MongoDB 集合中,以确保一切都以正确的顺序完成。最初我的数据以错误的顺序插入 MongoDB,过了一段时间我意识到这是因为我的 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') 在收到回调后应该关闭连接并移出瀑布。然而,我似乎得到的只是RangeError: Maximum call stack size exceeded。我已经尝试了所有我能想到的方法,但我无法让这个插入与回调一起工作并移出瀑布。
谁能帮忙?
【问题讨论】:
-
您可能在错误的地方寻找错误 - 您的
items变量是纯 JSON 对象吗? -
我确保
items中的每个item都根据猫鼬模式存储为一个新的Item对象。我相信我的回调做错了,一切正常,直到插入。 -
@germainelol,应该为 async.waterfall() 的每个任务调用回调。你只在你的第一个瀑布任务成功的情况下调用它......你根本没有在第三个瀑布任务中调用它。
-
@Ben 你能帮忙解决这个问题吗?我尝试遵循 async 的文档,但显然不是很好。
-
好的,因为评论太长,所以会回答。
标签: javascript node.js mongodb asynchronous callback