我在node.js中使用HTTP客户端时试图捕获ECONNREFUSED错误.我正在提出这样的要求:
var http = require('http');
var options = { host: 'localhost', port: '3301', path: '/', method: 'GET' };
http.request(options).on('response', function (res) {
// do some stuff
});
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何捕获此错误:
Error: connect ECONNREFUSED
at errnoException (net.js:614:11)
at Object.afterConnect [as oncomplete] (net.js:605:18)
Run Code Online (Sandbox Code Playgroud)
如果我这样做request.on('error', function () {});
,它就没有抓住它.如果我这样做:
var req = request.on(etc)
req.on('error', function blah () {});
Run Code Online (Sandbox Code Playgroud)
然后我明白了TypeError: Object false has no method 'on'
.
我是否真的必须做一个顶级未捕获错误的事情来处理这个?无论我做什么,我的整个过程都会退出.
编辑:我发现了一些关于如何通过创建connection
对象,调用request
它,然后绑定到connection
对象上的错误的博客文章,但这不会使整个http.request()
快捷方式无用吗?
Rya*_*lds 23
您之所以没有使用http://nodejs.org/docs/v0.6.5/api/http.html#http.request作为基础吗?试试这个:
var req = http.request(options, function(res) {
// Bind 'data', 'end' events here
});
req.on('error', function(error) {
// Error handling here
});
req.end();
Run Code Online (Sandbox Code Playgroud)
小智 6
每次调用都会http.request()
返回自己。所以像这样尝试...
http.request(options.function(){}).on('error',function(){}).end();
Run Code Online (Sandbox Code Playgroud)
我已经尝试过此(以及许多其他)页面上的所有建议,为此找到了解决方案。
我的客户需要检测运行嵌入式Windows的交钥匙产品。客户端是从另一台机器到交钥匙服务的。
交钥匙可以处于3种状态:
我的客户向我的nodejs / express服务发送了“查找交钥匙产品” GET消息,然后该服务尝试通过http.request查找交钥匙产品。这三个用例的行为分别是:
下面的代码处理所有3种情况。捕获ECONNREFUSED事件的技巧是了解其处理程序已绑定到套接字事件。
var http = require('http');
var express = require('express');
var url = require('url');
function find (req, res) {
var queryObj = url.parse(req.url, true).query;
var options = {
host: queryObj.ip, // client attaches ip address of turnkey to url.
port: 1234,
path: '/some/path',
}; // http get options
var badNews = function (e) {
console.log (e.name + ' error: ', e.message);
res.send({'ok': false, 'msg': e.message});
}; // sends failure messages to log and client
// instantiate http request object and fire it
var msg = http.request(options, function (response) {
var body = '';
response.on ('data', function(d) {
body += d;
}); // accumulate response chunks
response.on ('end', function () {
res.send({'ok': true, 'msg': body});
console.log('sent ok');
}); // done receiving, send reply to client
response.on('error', function (e) {
badNews(e);
}); // uh oh, send bad news to client
});
msg.on('socket', function(socket) {
socket.setTimeout(2000, function () { // set short timeout so discovery fails fast
var e = new Error ('Timeout connecting to ' + queryObj.ip));
e.name = 'Timeout';
badNews(e);
msg.abort(); // kill socket
});
socket.on('error', function (err) { // this catches ECONNREFUSED events
badNews(err);
msg.abort(); // kill socket
});
}); // handle connection events and errors
msg.on('error', function (e) { // happens when we abort
console.log(e);
});
msg.end();
}
Run Code Online (Sandbox Code Playgroud)