Node.js - 使用回调

时间:2015-08-26 15:57:32

标签: javascript node.js mongodb asynchronous callback

我尝试使用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')。我已经尝试了所有我能想到的东西,但是我无法通过回调来移动这个插件并移出瀑布。

有人可以帮忙吗?

2 个答案:

答案 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对象。这工作正常,并以正确的顺序将数据插入数据库,没有错误。感谢那些写下其他答案的人,我已经用它来修复和改进我的回调!