Javascript node.js在插入couchbase后从不退出,这与大多数节点问题相反
我的问题似乎与每个node.js问题相反:-)我有一个简单的forEach循环来读取文件列表并将它们插入Couchbase数据库。这非常有效,但在阅读了所有行之后,它永远不会退出。所以我添加了一个计数器,在所有插入完成后关闭couchbase连接。这很有效 这个过程的目的是加载数十万个文件,因此我将异步模块引入到混合中,以将插入分为100组。eachLimit用于迭代数组并批量插入文档。现在,原始问题又回来了。无论magic async.eachLimit使用什么方法来识别流程是否完成,都不会发生 我已经经历了javascript范围、回调、异步等等。谷歌搜索正在命中关键词,但不是这个问题。我已将代码缩减为以下测试用例。要进行测试,请创建三个文件并将其名称添加到testlist.txt async.eachLimit就地工作,直到达到极限,然后挂起。注释掉这一行并取消对array.forEach行的注释,它就可以工作了。提前谢谢Javascript node.js在插入couchbase后从不退出,这与大多数节点问题相反,javascript,node.js,asynchronous,couchbase,Javascript,Node.js,Asynchronous,Couchbase,我的问题似乎与每个node.js问题相反:-)我有一个简单的forEach循环来读取文件列表并将它们插入Couchbase数据库。这非常有效,但在阅读了所有行之后,它永远不会退出。所以我添加了一个计数器,在所有插入完成后关闭couchbase连接。这很有效 这个过程的目的是加载数十万个文件,因此我将异步模块引入到混合中,以将插入分为100组。eachLimit用于迭代数组并批量插入文档。现在,原始问题又回来了。无论magic async.eachLimit使用什么方法来识别流程是否完成,都不会发
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