错误事件和try catch不处理流上的ECONNREFUSED错误

时间:2016-09-30 06:45:42

标签: node.js express error-handling exception-handling

我正在使用npm请求模块将传入请求转发到另一台服务器:

app.get("/somepath", function(req, res) {
    var url = proxySetting.global.url + req.url;
    req.pipe(request(url)).pipe(res);
});

此处:proxySetting.global.url == http://localhost:4000

现在,当我将这样的传入请求转发到目标服务器时,如果目标服务器(localhost:4000)关闭或请求挂在目标服务器上。

会出现ECONNREFUSED或挂起错误等错误。

尝试使用下面的域模块

捕获这些错误
var d = domain.create();
d.on("error", function(err) {
    console.log("Error occoured while forwarding request");
    console.log(err);
    res.status(500).send("Error occoured while forwarding request");
});
d.run(function() {
    req.pipe(request(url)).pipe(res);
});

尝试在多个组合中捕获错误事件

    var request = require("request");

module.exports = function(proxySetting) {
    return function(req, res, next) {
        var url = proxySetting.global.url + req.url;
        url = url.replace(/([^:]\/)\/+/g, "$1") // replacing multiple slashes with one
        console.log("Forwarding request to: " + url);

        function errorHandler(err) {
            console.log("Error occoured while forwarding request");
            console.log(err);
            res.status(500).send("Error occoured while forwarding request");
        }
        req.on("error", errorHandler);
        res.on("error", errorHandler);
        req.pipe(request(url).on("error",errorHandler)).pipe(res);
    };
};

但仍然会向进程抛出异常并且服务器崩溃 我现在正在做的一种方式是

process.on('uncaughtException', function(err) {
  console.log("Some unhandled error occoured");
  console.log(err);
  console.log("Stopping server");
  process.exit(1);
});

但我认为捕捉uncaughtException并处理不是一个合适的解决方案

1 个答案:

答案 0 :(得分:1)

看来,你没有在"errorHandler"中对响应对象采取行动,如果你看到你的代码块(如下所示),res超出了范围。

function errorHandler(err) {
    console.log("Error occoured while forwarding request");
    console.log(err);
    res.status(500).send("Error occoured while forwarding request"); 
} 
req.on("error", errorHandler); 
res.on("error", errorHandler); 
req.pipe(request(url).on("error", errorHandler)) .pipe(res);

但是,如果您在错误句柄中对响应对象执行操作,则不会有任何uncaughtException

我已经创建了一个解决方案,如果代理服务器关闭,它将在错误句柄上作用于响应对象,因此它不会命中uncaughtException事件。

这是解决方案。

var response ;

app.get('/', function(req, res){
    var url = "http://localhost:3001" + req.url;
    response = res; // I am setting res to global variable here
    req.pipe(request(url).on("error",errorHandler)).pipe(res);

});


function errorHandler(err) {
    response.status(500).send("Error occoured while forwarding request");
}

process.on('uncaughtException', function(err) {
  console.log("Some unhandled error occoured");
  console.log(err);
  console.log("Stopping server");
  process.exit(1);
});

此处uncaughtException事件未被调用,我已经在解决方案中检查了回购,您可以尝试一下。回购地点 - here

使用" Run1.sh"对于成功案例," Run2.sh"代理服务器故障案例。