我是一個nodejs新手,習慣了所有異步的東西。Nodejs MySQL查詢塊請求模塊
使用: - 節點的MySQL(https://github.com/felixge/node-mysql) - 請求(https://github.com/mikeal/request) 模塊現在。
我在查詢一個大的URL列表(10,000個URL)並嘗試向它們發送一個HTTP GET請求來獲取它們的HTTP狀態。
它可以工作,但問題是,當我運行代碼時,當返回MySQL查詢中的每一行時,processURL函數被調用,它會在每個URL值後面記錄'BEFORE'和'AFTER' (據我所知)發送HTTP請求,但在返回HTTP狀態之前等待MySQL查詢完成。
簡單地說,它不能在查詢運行時檢查這些URL並返回它們的結果。它等待查詢完成以返回HTTP請求的結果。
這對我來說看起來毫無意義,因爲它在每一行流式傳輸時都運行processURL函數。下面是全碼:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'urlDB',
});
var query = connection.query('SELECT * FROM urls LIMIT 10000');
query.on('error', function(err) {
console.log(err);
})
query.on('result', function(row) {
processURL(row.urlValue, function() {
});
console.log(row.urlValue);
})
function processURL (url){
var request = require('request');
var startTime = new Date();
console.log('BEFORE');
request({
uri: url,
method: 'GET',
}, function(error, response, body) {
console.log('INSIDE');
var endTime = new Date();
if (!error) {
console.log(response.statusCode + ' Start: ' + startTime + ' End: ' + endTime);
} else {
console.log('timeout');
}
})
console.log('AFTER');
}
輸出如下: www.google.com BEFORE AFTER www.yahoo.com BEFORE AFTER www.cnn.com BEFORE AFTER ...但是在查詢完成之前沒有「INSIDE」。
任何幫助非常感謝和非常感謝。
感謝這麼多的響應。 – umutm
非常感謝回覆。但不完全相信如果是這樣的話(它也可以)。 console.log()需要15秒鐘才能從查詢中打印URL,並且在此期間不會打印「INSIDE」。但是,我想知道這是否可以是一個性能問題與console.log()是同步。儘管更新的代碼似乎工作,它會跳過(明白它可以是唯一的文本環境)你的MySQL查詢部分可能是有問題的部分(我也認爲不是)。 – umutm
實際上,在寫作時,你的結果聽起來更合理。 將回來更多的測試。 再次非常感謝(如果是這種情況,我會很樂意接受答案)。 – umutm