我正在使用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并处理不是一个合适的解决方案
答案 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"代理服务器故障案例。