使用http模块的节点服务器中的异常

时间:2014-03-25 16:01:33

标签: node.js http

请注意上述"可能的答案"问题不包含我的问题的答案。我正在使用require(" http")。在那个问题中,这个人正在接受一个套接字输入变量,他们可以将处理程序放在上面。我没有相同的变量。

我有一个非常简单的服务器,我在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)

当服务器正在提供文件时,它似乎不会崩溃,而是在请求之间等待很长时间。

虽然我的代码有点复杂,但每次回调都会出现错误。

为什么会崩溃?我该怎么办?

1 个答案:

答案 0 :(得分:3)

在节点中,在任何地方播放trycatch与捕获每个错误都不一样。 (在大多数情况下,这样做是没用的。)异步操作不能抛出有用的异常,因为控件很久以前就留下了调用操作的代码块。

相反,许多对象会发出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事件的内容,添加一个侦听器来处理错误。