nodejsmysql查询块请求模块
我是一个nodejs新手,已经习惯了所有异步的东西 使用: -节点MySQL(https://github.com/felixge/node-mysql) -请求(https://github.com/mikeal/request) 现在就开始 我正在查询一个大的URL列表(10000个URL),并试图向它们发送一个HTTP GET请求以获取它们的HTTP状态 它可以工作,但问题是,当我运行代码时,当MySQL查询中的每一行返回时,调用processURL函数,它在每个URL值之后(据我所知)记录“BEFORE”和“AFTER”发送HTTP请求,但在返回HTTP状态之前等待MySQL查询完成 简单地说,它无法在查询运行时检查这些URL并返回其结果。它等待查询完成以返回HTTP请求的结果 这在我看来毫无意义,因为它在每一行流式传输时运行processURL函数。以下是完整的代码:nodejsmysql查询块请求模块,mysql,node.js,httprequest,Mysql,Node.js,Httprequest,我是一个nodejs新手,已经习惯了所有异步的东西 使用: -节点MySQL(https://github.com/felixge/node-mysql) -请求(https://github.com/mikeal/request) 现在就开始 我正在查询一个大的URL列表(10000个URL),并试图向它们发送一个HTTP GET请求以获取它们的HTTP状态 它可以工作,但问题是,当我运行代码时,当MySQL查询中的每一行返回时,调用processURL函数,它在每个URL值之后(据我所知)记
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
之前
之后
www.yahoo.com
之前
之后
www.cnn.com
之前
之后
…但在查询完成之前,没有“内部”
非常感谢您的帮助。我修改了您的示例,以更慢的速度获得结果,效果如预期。您可以复制粘贴以尝试:
var request = require('request');
var urls = ['http://google.com', 'http://yahoo.com', 'http://ninjaturtles.com'];
getResultSlowly();
function getResultSlowly() {
var result = urls.shift();
if (!result) return;
console.log(result);
processUrl(result);
setTimeout(getResultSlowly, 1000);
}
function processUrl(url) {
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');
}
网络延迟很可能只是掩盖了异步行为
查询结果将立即返回,在执行代码后立即触发几个result
事件。然而,您的请求
事件将花费相当长的时间(即使只有一两毫秒),因为它必须与谷歌、雅虎或任何人建立连接
输出:
$ node asynctest.js
http://google.com
BEFORE
AFTER
INSIDE
200 Start: Sat Dec 29 2012 11:31:34 GMT-0500 (EST) End: Sat Dec 29 2012 11:31:34 GMT-0500 (EST)
http://yahoo.com
BEFORE
AFTER
http://ninjaturtles.com
BEFORE
AFTER
INSIDE
200 Start: Sat Dec 29 2012 11:31:36 GMT-0500 (EST) End: Sat Dec 29 2012 11:31:37 GMT-0500 (EST)
INSIDE
200 Start: Sat Dec 29 2012 11:31:35 GMT-0500 (EST) End: Sat Dec 29 2012 11:31:38 GMT-0500 (EST)
非常感谢您的回复。但不确定情况是否如此(也可能如此)。console.log()从查询中打印URL大约需要15秒,在此期间不会打印“内部”。但是,我想知道这是否是console.log()同步时的性能问题。虽然更新的代码似乎可以工作,但它跳过了MySQL查询部分(请理解它可能是唯一的文本env.you),而这可能是有问题的部分(我也认为不是)。实际上,在编写时,您的结果听起来更合理。会带着更多的测试回来。再次非常感谢(如果是这样的话,我会很高兴地接受答案)。15s部分听起来很奇怪,最好用console.log()来隔离这种行为。s查询的结果。。。因为查询本身应该没有明显的延迟(特别是在localhost上!)。