我是一个 nodejs 新手,已经习惯了所有异步的东西。
使用: - Node-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'。
任何帮助表示赞赏,非常感谢。