节点请求不能等到响应,即使使用回调

时间:2016-04-05 13:30:56

标签: javascript node.js callback httprequest

这是我正在测试的代码,它不会每次都返回响应。就像我跑20次一样,只有一次我能得到身体的输出。其他时候,我没有输出任何内容,甚至没有看到任何错误消息。

我想这是因为请求运行得太快而无法获得响应。

有人可以帮我吗? 感谢。

get_from_google : function (callback) {
    request('http://www.google.com', function (error, response, body) {
        if (!error && response.statusCode === 200) {
            console.info('Success');
            callback(body);
            //console.log(body); // Show the HTML for the Google homepage.
        } else {
            console.info('Failed');
            //console.log(body)
        }
        console.info('google request')
    }).on('body',function (body) {
        callback(body);
    })
}

我在函数中添加了输出(错误,响应,正文),如下所示。但没有任何结果。

get_from_google : function (callback) {
    request('http://www.google.com', function(err, res, body) {
        console.info('In the callback');
        if (err)
            return callback(err);
        if (res.statusCode === 200) {
            callback(new Error('Nothing got back'), body);
        } else {
            callback(new Error('Unexpected status code: ' + res.statusCode));
        }
    });
}

以下是控制台中的输出:

Starting selenium standalone server...
[launcher] Running 1 instances of WebDriver
Selenium standalone server started at http://10.33.203.210:53537/wd/hub
Started
.


Ran 1 of 3 specs
1 spec, 0 failures
Finished in 0.019 seconds
Shutting down selenium standalone server.
[launcher] 0 instance(s) of WebDriver still running
[launcher] chrome #01 passed

Process finished with exit code 0

1 个答案:

答案 0 :(得分:0)

这里有一些问题:

  1. 正在忽略请求错误。例如,如果连接到服务器时出现问题,则可能发生错误。
  2. 添加body事件处理程序是不必要的,因为您已经有另一个回调。
  3. 最好保留(err, result[, ...resultn])的节点式回调签名。
  4. 考虑到这些因素,您可以尝试以下方式:

    get_from_google: function(callback) {
      request('http://www.google.com', function(err, res, body) {
        if (err)
          return callback(err);
        if (res.statusCode === 200) {
          callback(null, body);
        } else {
          callback(new Error('Unexpected status code: ' + res.statusCode));
        }
      });
    }