nodejsmysql查询块请求模块

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值之后(据我所知)记

我是一个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函数。以下是完整的代码:

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上!)。