首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs MySQL查询块请求模块

问Nodejs MySQL查询块请求模块
EN

Stack Overflow用户
提问于 2012-12-29 23:47:20
回答 1查看 742关注 0票数 0

我是nodejs新手,正在习惯所有异步的东西。

现在使用:- Node-MySQL (https://github.com/felixge/node-mysql) - Request (https://github.com/mikeal/request)模块。

我正在查询一个很大的URL列表(10,000个URL),并尝试向它们发送一个HTTP GET请求,以获取它们的HTTP状态。

它可以工作,但问题是,当我运行代码时,当MySQL查询中的每一行被返回时,processURL函数被调用,它在每个URL值之后记录“之前”和“之后”(据我所知)发送HTTP请求,但在返回HTTP状态之前等待MySQL查询完成。

简单地说,它不能在查询运行时检查这些URL并返回其结果。它等待查询完成,以返回HTTP请求的结果。

这在我看来毫无意义,因为它在流式传输每一行时都会运行processURL函数。下面是完整的代码:

代码语言:javascript
复制
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 ...but no 'INSIDE‘直到查询完成。

我们非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-30 00:36:12

我修改了您的示例,以获得更慢的结果,它可以按预期工作。您可以复制-粘贴来尝试:

代码语言:javascript
复制
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事件。然而,您的request事件将花费相当长的时间(即使只有一两毫秒),因为它必须与谷歌或雅虎或其他任何人建立连接。

输出:

代码语言:javascript
复制
$ 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14083276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档