如何在http.ServerResponse对象上调用end()?

时间:2012-08-15 15:15:40

标签: javascript http node.js error-handling

我找到了已接受的answer in this question来回答我遇到的错误处理问题。

请注意注释 - 需要完成http.ServerResponse,以便应用程序最终不会耗尽内存 - 这是一个问题。

虽然如何实现这样的东西?回调函数如何访问所述对象?

2 个答案:

答案 0 :(得分:1)

'uncaughtException'处理程序无权访问响应对象,因此无法结束响应。评论的假定点是,您不应该依赖'uncaughtException'来满足您的所有错误处理需求,因为在许多情况下(如上所述)您没有正确处理错误的范围。< / p>

答案 1 :(得分:1)

正如this post的答案中所提到的 - 如果你有一个未被捕获的异常,你最好的方法是让进程死掉并从那里恢复 - 否则你不知道应用程序的当前状态是什么是

因为您没有捕获异常,所以它表明应用程序不知道发生了什么。为了解决这个问题 - 您可以在很多小块中设计应用程序,而不是在一个过程中。

这会轻微地影响性能(RPC与进程通信),但这意味着你可以轻松入睡,而小块出错,重启并且一切都很好,因为它们永远不会维持状态(使用Redis)。 ..

如果你真的想在请求中捕获异常,然后在请求上调用end(),你必须使用一个具有访问响应的闭包,如下所示:

// a method that will catch an error and close the response
var runFunctionSafely = function(res, tryFunction){
  try{
    tryFunction();
  }
  catch(error){
    console.log('there was an error, closing the response...');
    console.log(error);
    res.end();
  }
}

app.get('/test', function(req, res, next) {
  runFunctionSafely(res, function(){
    throw new Error('this is a problem');
  })
});