我有一个非常简单的服务器,我在Node中写过。
var http = require("http");
var sys = require("sys");
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({
target: "someServer"
});
http.createServer(function(request, response) {
try {
proxy.web(request,response);
} catch (err) {
sys.puts("I caught an error!");
}
}).listen(5000);
当我让我的应用程序运行时,它会崩溃。我的命令行说:
events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
当服务器正在提供文件时,它似乎不会崩溃,而是在请求之间等待很长时间。
虽然我的代码有点复杂,但每次回调都会出现错误。
为什么会崩溃?我该怎么办?
答案 0 :(得分:3)
在节点中,在任何地方播放try
和catch
与捕获每个错误都不一样。 (在大多数情况下,这样做是没用的。)异步操作不能抛出有用的异常,因为控件很久以前就留下了调用操作的代码块。
相反,许多对象会发出error
事件。 error
事件是special case,该节点将抛出一个真实的"如果没有该事件的侦听器,则为exception。因为这个异常是从你不能控制的代码抛出的(即用try
/ catch
包裹),所以它没有被捕获并且过程结束。
因此,如果您没有向套接字添加error
侦听器,则套接字错误将导致整个应用程序崩溃。
但是,您的未处理错误并非来自您的http请求。 http模块adds an error
handler to every socket automatically,并在clientError
上以Server
事件重新发出错误。由于EventEmitters
仅在事件被命名为error
时抛出,因此您无法处理clientError
并不重要。
如果我们阅读http-proxy documentation, we see that it also throws an error
event,您就不会收听它。因此,只要从上游服务器获取内容时出现错误,您的应用就会消失。
添加error
处理程序。
proxy.on('error', function (err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong.');
console.error(err);
});
任何时候您都会看到此错误(" // Unhandled 'error' event
"),这意味着您需要找出发出error
事件的内容,添加一个侦听器来处理错误。