Javascript node.js在插入couchbase后从不退出,这与大多数节点问题相反

Javascript node.js在插入couchbase后从不退出,这与大多数节点问题相反,javascript,node.js,asynchronous,couchbase,Javascript,Node.js,Asynchronous,Couchbase,我的问题似乎与每个node.js问题相反:-)我有一个简单的forEach循环来读取文件列表并将它们插入Couchbase数据库。这非常有效,但在阅读了所有行之后,它永远不会退出。所以我添加了一个计数器,在所有插入完成后关闭couchbase连接。这很有效 这个过程的目的是加载数十万个文件,因此我将异步模块引入到混合中,以将插入分为100组。eachLimit用于迭代数组并批量插入文档。现在,原始问题又回来了。无论magic async.eachLimit使用什么方法来识别流程是否完成,都不会发

我的问题似乎与每个node.js问题相反:-)我有一个简单的forEach循环来读取文件列表并将它们插入Couchbase数据库。这非常有效,但在阅读了所有行之后,它永远不会退出。所以我添加了一个计数器,在所有插入完成后关闭couchbase连接。这很有效

这个过程的目的是加载数十万个文件,因此我将异步模块引入到混合中,以将插入分为100组。eachLimit用于迭代数组并批量插入文档。现在,原始问题又回来了。无论magic async.eachLimit使用什么方法来识别流程是否完成,都不会发生

我已经经历了javascript范围、回调、异步等等。谷歌搜索正在命中关键词,但不是这个问题。我已将代码缩减为以下测试用例。要进行测试,请创建三个文件并将其名称添加到testlist.txt

async.eachLimit就地工作,直到达到极限,然后挂起。注释掉这一行并取消对array.forEach行的注释,它就可以工作了。提前谢谢

var fs = require('fs');
var couchbase = require('couchbase');
var async = require('async');

var filelist = 'testlist.txt';
var key_count = 0;
var cb_config = { host: 'localhost:8091', bucket: 'default'};
var db = new couchbase.Connection(cb_config, function(err) {
  if (err) {
    console.log('ERRR connect to couchbase at config['+cb_config+']');
    throw err;
  }
});

var insertFile=function(line) {
    console.log('LOAD ['+line+']');

    fs.readFile(line, function(file_err, f_doc) {
        if(file_err) throw file_err;

        db.set(line, f_doc, function(db_err, db_res){
            if (db_err) {
                console.log('FAIL ['+line+'] err['+db_err+']');
            } else {
                console.log('PASS ['+line+']');
            }

            key_count--;
            if (key_count == 0) {
                console.log('DONE Shutting down client, no more keys');
                db.shutdown();
            }
        });
    });
}

// read list of files into data array from file filelist
fs.readFile(filelist, function(filelist_err, lines) {
    if(filelist_err) throw filelist_err;

    // HACK split adds empty line to array, use replace to fix
    var array = lines.toString().replace(/\n$/, '').split('\n');
    key_count = array.length;
    console.log('INIT lines['+key_count+']');

    async.eachLimit(array, 2, insertFile, function(err) { console.log('FAIL async err['+err+']');} );
    //array.forEach(function(data){insertFile(data);return;});
});
使用array.forEach的测试用例输出:

INIT lines[3]
LOAD [files.big.txt]
LOAD [files.little.txt]
LOAD [files.txt]
PASS [files.little.txt]
PASS [files.big.txt]
PASS [files.txt]
DONE Shutting down client, no more keys
使用async.eachLimit的Testcase输出:

INIT lines[3]
LOAD [files.big.txt]
LOAD [files.little.txt]
PASS [files.little.txt]
PASS [files.big.txt]
... hang, never gets to 3...

在与一位同事回顾之后,他们发现了我的错误。我错过了
insertFile
函数中的异步回调。加上它,我就可以移除钥匙计数器了!解决方案代码如下:

var fs = require('fs');
var couchbase = require('couchbase');
var async = require('async');

var filelist = 'testlist.txt';
var key_count = 0;
var cb_config = { host: 'localhost:8091', bucket: 'default'};
var db = new couchbase.Connection(cb_config, function(err) {
  if (err) {
    console.log('ERRR connect to couchbase at config['+cb_config+']');
    throw err;
  }
});

var insertFile=function(line, callback) {
    console.log('LOAD ['+line+']');

    fs.readFile(line, function(file_err, f_doc) {
        if(file_err) throw file_err;

        db.set(line, f_doc, function(db_err, db_res){
            if (db_err) {
                console.log('FAIL ['+line+'] err['+db_err+']');
                callback(db_err);
            } else {
                console.log('PASS ['+line+']');
                callback();
            }
        });
    });
}

// read list of files into data array from file filelist
fs.readFile(filelist, function(filelist_err, data) {
    if(filelist_err) throw filelist_err;

    // HACK stoopid bug split adds empty line to array, use replace to fix
    var array = data.toString().replace(/\n$/, '').split('\n');
    key_count = array.length;
    console.log('READ files['+key_count+']');

    async.eachLimit(array, 2, insertFile, function(err) { 
        if (err) console.log('LAST with async err['+err+']');

        console.log('DONE Shutting down client, no more keys');
        db.shutdown();
    });
});
和成功输出:

$ node testcase.js
READ files[3]
LOAD [files.big.txt]
LOAD [files.little.txt]
PASS [files.little.txt]
LOAD [files.txt]
PASS [files.big.txt]
PASS [files.txt]
DONE Shutting down client, no more keys