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

无法使用Express处理Node.js域的异常

斜浩穰
2023-03-14
问题内容

我想使用Node.js域来捕获异常。到目前为止,它正在运行,但是有一个地方我无法获得域来捕获异常。回调中的exception2是在domain.on(’error’)处理程序中捕获并处理的,但没有捕获exception1。奇怪的是,当抛出exception1时,它不会像我期望的那样关闭Node。这是我的示例应用程序:

var domain = require('domain');
var request = require('request');
var express = require('express');

var serverDomain = domain.create();
serverDomain.on('error', function(err) {
  console.log("Server Domain Error: " + err);
});

var app;

serverDomain.run(function() {
  app = express();
  app.listen(3000);
});

app.use(function(req, res, next) {

  var reqDomain = domain.create();
  reqDomain.add(req);
  reqDomain.add(res);
  reqDomain.on('error', function(err) {
    console.log("Req Domain Error: " + err);
    reqDomain.dispose();
    next(err);
  });

  next();
});

app.get('/', function(req, res) {
  var uri = "http://google.com";

  exception1.go();

  request.get({url:uri, json: {}},
    function (error, response, body) {
      if(response.statusCode === 200) {
        exception2.go();
        res.send('Success getting google response');
      }
    });
});

为了使exception2执行,我注释掉了exception 1。


问题答案:

问题在于该异常发生在Connect的路由过程中,该路由在其执行过程中有一个try/catch块,同时还有一个默认的错误处理程序,该错误处理程序在非生产模式下运行时会打印出堆栈跟踪详细信息。由于异常是在Express内部处理的,因此它永远不会到达域的外部层。

它的区别在于,路由exception2的处理程序函数'/'直接由该Connect块执行,与通过Express进行的原始调用位于同一堆栈中。第二个异常发生在
回调中 ,返回了一些I / O操作之后,因此由Node的事件循环I /
O处理程序发起的堆栈执行,因此try/catchExpress的功能无法捕获该异常并保存应用服务器。实际上,如果您注释掉所有域内容,并exception2使其跳闸,则会使Node崩溃。

由于仅将未处理的异常路由到域机制,并且由于在其上方的调用堆栈中exception1try/catch可见的异常,因此将处理该异常,而不将其转发到域。



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

  • 现在我在后端写了一个路由用了puppeteer这个库,但是这个会经常出错,会导致后端服务挂掉,然后不能运行,想问一下怎么处理很多的异常,是对try catch进行封装吗?然后全局捕获?

  • 问题内容: 我研究了如何通过此堆栈交换在节点中进行错误处理,但是我不确定身份验证失败时护照在做什么。我有以下LocalStrategy: 在看到“错误>某些错误”控制台打印输出后,什么都没有发生。我认为它应该在带有错误参数的下一条路径上继续,但似乎没有这样做。这是怎么回事? 问题答案: 策略实施与验证请求和处理成功/失败一起使用。 假设您正在使用此路由(向其传递了电子邮件地址和密码): 这将调用该

  • 问题内容: 当客户端/浏览器取消了挂起的HTTP请求时,带有Express的Node似乎继续处理该请求。对于密集请求,CPU仍然忙于处理不必要的请求。 有没有办法让Node.js / Express杀死/停止这些被要求取消的未决请求? 它给出的是,由于AngularJS 1.5 HTTP请求是容易变得特别有用的撤销通过调用上/ 对象。 当暴露提供自动完成或搜索字段结果的API方法时,可能会发生此类

  • 本文向大家介绍解析Node.js异常处理中domain模块的使用方法,包括了解析Node.js异常处理中domain模块的使用方法的使用技巧和注意事项,需要的朋友参考一下 NodeJS 提供了 domain 模块,可以简化异步代码的异常处理。在介绍该模块之前,我们需要首先理解“域”的概念。简单的讲,一个域就是一个 JS 运行环境,在一个运行环境中,如果一个异常没有被捕获,将作为一个全局异常被抛出。

  • 问题内容: 我当前正在使用一个Web应用程序,每次都调用此Web应用程序,请删除所有当前的Express会话,因此我需要一种方法来保留所有这些会话。我试图用connect- mongodb和connect- redis保留所有这些会话,但是都无效,nodemon总是说req.session是未定义的。我不知道该怎么做才能保留所有会话。 我需要一种方法来保留所有会话,执行时不要丢失它们,并为其提供教