我正在使用iojs和node-mysql。这是我第一次进入异步服务器端编程。它基本上是一个批处理作业:运行一次,退出。我特意试图在一张充满版本的表格上做到这一点:如何在不断开连接的情况下在node.js mysql中使用递归?
对于过去一年中编辑的每个文档;该文件在过去一年中的每次修订;获得之前的修订并将其内容与当前版本进行比较。
所以,我用一个查询(每个文档)的结果,以火过的其他查询任意数量(每个修订),必须自己递归(获得前修订) 。
我想不出如何关闭数据库连接。据我所知,递归是混杂因素:如果我从代码中删除它,那么我可以关闭数据库连接。但我需要缓解。
这是一个最小的例子(假设需求和配置都OK),它完成了我在程序中看到的行为。
var con = mysql.createConnection(db_config);
con.connect();
con.query('SELECT field_2 FROM test_table', function(err, rows) {
if (err) throw err;
rows.forEach(function(row) {
second_query(row.field_2);
});
// using this here works if there is no recursion, even if second_query runs long
// using this here does not work if there is recursion
// removing this allows the program to run to completion, but the event loop never exits
con.end()
});
function second_query(key) {
con.query('SELECT * FROM test_table_2 WHERE field_2 > ?', [key], function(err, rows) {
if (err) throw err;
if (rows.length > 0) {
rows.forEach(function(row) {
console.log(row.field_2);
});
second_query(key + 1);
}
});
}
我已经很努力在累加器注册数据库查询和每个查询结束递减蓄电池来解决问题,但是这并没有产生可预测的成功,但它使代码的痛苦与合作。
我喜欢这个答案,很干净:)。 'drain'函数是否带有err参数?或者排队激发错误事件? –
不,错误必须在发生时适当地处理,您可以选择允许队列继续,暂停,终止等等。我不认为有任何关于错误处理的假设。 https://github.com/caolan/async/blob/master/lib/async。js#L731 –