node.js在发出http请求时区分错误

时间:2013-10-11 15:48:50

标签: node.js http rest timeout

我的node.js应用程序正在使用http.request到REST API http://army.gov/launch-nukes,我需要区分三种可能的情况:

  • Success - 服务器回复是肯定的。我知道我的敌人被摧毁了。
  • Failure - 我收到服务器错误,或无法连接到服务器。我还有敌人。
  • Unknown - 建立与服务器的连接后,我发送了请求 - 但不确定发生了什么。这可能意味着请求从未进入服务器,或者服务器对我的响应从未成功。我或许可能刚刚开始了一场世界大战。

正如您所看到的,区分FailureUnknown案例非常重要,因为它们会产生截然不同的后果和不同的行动。

我也非常想使用http Keep-Alive - 我可以说,我是一个战争贩子,并计划在爆发时提出大量请求(然后长期没有任何请求)时间)

-

问题的核心是如何将连接错误/超时(这是Failure)与请求放在线路上发生的错误/超时分开(这是一个{ {1}})。

在伪代码逻辑中我想要这个:

Unknown

2 个答案:

答案 0 :(得分:32)

以下是一个例子:

var http = require('http');

var options = {
  hostname: 'localhost',
  port: 7777,
  path: '/',
  method: 'GET'
};

var req = http.request(options, function (res) {
  // check the returned response code
  if (('' + res.statusCode).match(/^2\d\d$/)) {
    // Request handled, happy
  } else if (('' + res.statusCode).match(/^5\d\d$/))
    // Server error, I have no idea what happend in the backend
    // but server at least returned correctly (in a HTTP protocol
    // sense) formatted response
  }
});

req.on('error', function (e) {
  // General error, i.e.
  //  - ECONNRESET - server closed the socket unexpectedly
  //  - ECONNREFUSED - server did not listen
  //  - HPE_INVALID_VERSION
  //  - HPE_INVALID_STATUS
  //  - ... (other HPE_* codes) - server returned garbage
  console.log(e);
});

req.on('timeout', function () {
  // Timeout happend. Server received request, but not handled it
  // (i.e. doesn't send any response or it took to long).
  // You don't know what happend.
  // It will emit 'error' message as well (with ECONNRESET code).

  console.log('timeout');
  req.abort();
});

req.setTimeout(5000);
req.end();

我建议您使用netcat玩它,即:

$ nc -l 7777
// Just listens and does not send any response (i.e. timeout)

$ echo -e "HTTP/1.1 200 OK\n\n" | nc -l 7777
// HTTP 200 OK

$ echo -e "HTTP/1.1 500 Internal\n\n" | nc -l 7777
// HTTP 500

(依此类推......)

答案 1 :(得分:1)

这通常在API状态代码中。在请求包中,您可以像这样访问它

request('http://www.google.com', function (error, response, body) {
   if (!error && response.statusCode == 200) {
       console.log(body) // Print the google web page.
   }
})

response.statusCode 200表示它有效。 500将失败。未知将是永远不会被调用的回调。

如果您描述的API不遵循标准响应代码,我不知道。你必须看看文档。