我正在使用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 –