2015-12-23 21 views
0

我循環了一些目錄,然後是其中的文件。我按目錄處理這些文件,然後嘗試將處理後的結果添加到MySQL中。 我打電話給conn.query('插入查詢這裏'),它似乎繼續,但查詢永遠不會在服務器上運行。如果我告訴它只處理一個目錄並等待結束,它將運行查詢,但我不能讓它繼續將所有查詢存儲在內存中,直到腳本或節點的末尾由於內存限制而失敗。我嘗試了所有我能想到的嘗試強制排隊查詢運行但沒有運氣。節點Mysql查詢隊列,但從未執行

這裏是我的代碼

dirs.forEach(function(dir){ 
    var data = []; 
    var connection = mysql.createConnection(conConfig); 
    files.forEach(function(file){ 
    //do some processing on files push into data array 
    //creating array of objects 
    }); 
    data.forEach(function(record){ 
    connection.query('INSERT INTO TABLE SET ?', record); 
    }); 
    connection.end(); 
}); 

代碼只會繼續遍歷目錄而沒有將查詢發送到MySQL的一個例子。我知道這將通過限制代碼在一個目錄上運行起作用,並且一旦處理完一個目錄,它就會使查詢不起作用,但如果讓它在所有目錄上運行,則不會。

我一直在使用MySQL的池以及沒有運氣嘗試。 pool.on('enqueue' function...會觸發,但絕不會將其發送到服務器。

編輯: 所以我試着用bash中的for循環調用腳本來單獨調用每個dir名稱,並加載了所有記錄。我對於爲什麼在我的原始示例中永遠不會建立mysql連接感到驚訝。

+0

你是否確認了每個循環中你的價值觀是好的?嘗試添加一個回調函數作爲'connection.query()'的第三個參數,並確保沒有錯誤。 – miken32

+0

我有,我只是把一些基本代碼放在那裏給出一個結構的想法。如前所述,如果我只是在一個目錄上運行(不管哪一個),它每次都會起作用。但是,是的,如果有錯誤的話,會有一個錯誤的功能。 –

回答

0

它實際上是一個異步的問題。似乎沒有任何方法強制排隊查詢在不停止當前正在運行的進程的情況下執行。我必須使用異步模塊才能使代碼正常工作。

@luksch connection.end()不會關閉,直到所有的連接排隊查詢完成。儘管我使用他的迭代方法來進行回調。

這是我做到的。

var async = require('async'); 
var connection = mysql.createConnection(conConfig); 
var dirs = fs.readdirSync('./rootdirectory'); 

async.eachSeries(dirs,function(dir,callback){ 
    var data = []; 
    files.forEach(function(file){ 
    //do some processing on files push into data array 
    //creating array of objects 
    }); 
    var qCount = data.length; 
    data.forEach(function(record){ 
    connection.query('INSERT INTO TABLE SET ?', record, function(err){ 
     if (err) throw err; 
     qCount-- 
     if(qCount === 0) { callback(true); } 
    }); 
    }); 
    function(){ connection.end(); } 
}); 

這將遍歷目錄和隊列中的所有查詢,然後強迫疑問,直到所有的目錄都已經被處理,然後調用最終功能關閉連接來運行。

0

異步的JavaScript調用MySQL查詢。這意味着在所有插入查詢完成之前連接可能會被關閉。

你可以做的是使用查詢功能提供了回調:

var qCnt = array.length; 
var connection = mysql.createConnection(conConfig); 
connection.connect(); 
array.forEach(function(record){ 
    connection.query('INSERT INTO TABLE SET ?', record, function(err){ 
    if (err) throw err; 

    qCnt--; 
    if (qCnt == 0){ 
      connection.end(); 
    } 
    }); 
}); 

該解決方案是不理想的,因爲所有的插入查詢,無論解僱你的數據庫連接限制等可能要僅在前者完成後觸發下一個插入。這也是可能的一些技巧。

+0

我已經嘗試了這種方法,並沒有改變行爲。我不明白的是爲什麼mysql lib等到腳本完成後才建立到mysql服務器的連接。我知道它正在調用查詢命令,因爲我可以從中取出var並註銷查詢字符串。 –

+0

根據mysql的npm modul文檔,你應該在創建連接後調用'connection.connect();'。我在我的答案中加入了這個。 (請參閱https://www.npmjs.com/package/mysql) – luksch

+0

您不直接在下面說:「但是,也可以通過調用查詢隱式建立連接:」並且調用connect不會建立連接。此外,查詢回調從不被調用。 –