当前位置: 首页 > 面试题库 >

异步node.js调用中的错误处理

况安然
2023-03-14
问题内容

我对Node.js并不陌生,尽管我通常对JavaScript非常熟悉。我的问题是关于如何处理node.js中的错误的“最佳实践”。

通常,在对Web服务器,FastCGI服务器或各种语言的网页进行编程时,我在多线程环境中使用带有阻止处理程序的Exceptions。当有请求进入时,我通常会执行以下操作:

function handleRequest(request, response) {
  try {

    if (request.url=="whatever")
      handleWhateverRequest(request, response);
    else
      throw new Error("404 not found");

  } catch (e) {
    response.writeHead(500, {'Content-Type': 'text/plain'});
    response.end("Server error: "+e.message);
  }
}

function handleWhateverRequest(request, response) {
  if (something) 
    throw new Error("something bad happened");
  Response.end("OK");
}

这样,我始终可以处理内部错误并向用户发送有效响应。

我知道使用node.js可以执行非阻塞调用,这显然会导致各种回调,例如以下示例:

var sys    = require('sys'),
    fs     = require('fs');

require("http").createServer(handleRequest).listen(8124);

function handleRequest(request, response) {

  fs.open("/proc/cpuinfo", "r",
    function(error, fd) {
      if (error)
        throw new Error("fs.open error: "+error.message);

      console.log("File open.");

      var buffer = new require('buffer').Buffer(10);
      fs.read(fd, buffer, 0, 10, null,
        function(error, bytesRead, buffer) {

          buffer.dontTryThisAtHome();  // causes exception

          response.end(buffer);
        }); //fs.read

    }); //fs.open

}

此示例将完全杀死服务器,因为未捕获异常。我的问题是,我不能再使用单个try / catch,因此通常无法捕获在处理请求期间可能引发的任何错误。

当然,我可以在每个回调中添加try / catch,但是我不喜欢这种方法,因为这取决于程序员他不会 忘记 try /
catch。对于具有许多不同和复杂处理程序的复杂服务器,这是不可接受的。

我可以使用全局异常处理程序(防止整个服务器崩溃),但是由于我不知道哪个请求导致异常,所以我无法向用户发送响应。这也意味着请求保持未处理/打开状态,浏览器一直在等待响应。

有人有好的坚如磐石的解决方案吗?


问题答案:

节点0.8引入了一个称为“域”的新概念。它们与.net中的AppDomains非常相似,并提供了封装一组IO操作的方式。它们基本上允许您将请求处理调用包装在特定于上下文的组中。如果该组引发任何未捕获的异常,则可以以某种方式处理和处理它们,使您可以访问所需的所有范围和上下文特定信息,以便成功地从错误中恢复(如果可能)。

此功能是新功能,只是刚刚引入,因此请谨慎使用,但据我所知,它是专门为处理OP试图解决的问题而引入的。

可以在以下位置找到文档:http :
//nodejs.org/api/domain.html



 类似资料:
  • 编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。 例如,setTimeout()函数可以传入回调函数,并在指定若干毫秒后执行: function printTime() { console.log('It is time!'); } setTimeout

  • 问题内容: 我目前正在使用node.js应用程序,并且遇到了通常的异步代码问题。 我正在Node的HTTP模块之上实现服务服务器。 该服务器支持(类似表达)路由。例如,我有如下代码: 服务器需要能够承受故障,当传递给任何函数的问题出现时,我不想使整个服务器崩溃。当我编写如下代码时,会发生问题: 我看不到如何在这里捕获错误。我不想因一个服务器端故障而使服务器崩溃,而是要服务500个。 我能够提出的唯

  • 问题内容: 我有一个Express中间件,因为我想在其中使用中间件来清理我的代码。 问题在于,当它拒绝时,它不会进入我的错误中间件,但是如果我删除了关键字,并且在中间件中,它将删除。 所以我得到的不是输入我的错误处理中间件,而是如何让错误冒泡并表达处理它? 问题答案: 问题是当它拒绝时,它不会进入我的错误中间件,但是如果我删除了async关键字并扔进了中间件中,它就会去。 目前不支持诺言,将来的版

  • 问题内容: 现在,我有几次遇到使用Firebase的同步和异步功能的问题。我的问题通常是我需要在我编写的函数中进行异步Firebase调用。作为一个简单的示例,假设我需要计算并显示对象的速度,而我的Firebase存储距离和时间: 当然,上述代码将无法使用,因为它是异步调用,因此在到达时尚未设置。如果我们将内部放置在回调函数中,则什么也不会返回。 一种解决方案是使我的函数也异步。 另一种解决方案是

  • 在Spring integration中,我必须处理动态通道创建,但当我调试应用程序时,我看到不同通道之间的“阻塞”问题。 我知道是一个公共通道,在父上下文中共享,但如何为每个子上下文开发一个完整的独立场景?。公共网关是问题所在吗? 我在Spring integration flow async中看到了post错误处理,但对于每个子级,我都有一个完整的分离环境,我希望利用这些动态分离的优势。这可能

  • 问题内容: 我具有以下Spring Integration配置,该配置允许我从MVC Controller调用网关方法并让控制器返回,而集成流将在不阻塞控制器的单独线程中继续进行。 但是,我无法弄清楚如何使我的错误处理程序为该异步流工作。我的网关定义了错误通道,但是由于某种原因我的异常没有到达。相反,我看到被调用了。 网关: 为了查看我的错误处理程序正在处理的异步集成流程中发生的异常,我该怎么办?