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

如何将每个Express JS请求包装在域或trycatch中

利俊迈
2023-03-14
问题内容

是否可以将通过express.js发出的每个请求包装到中,domaintrycatch
在此处查看trycatch信息?

我正在尝试创建一种“全部捕获”(快速错误处理程序中间件不捕获异步调用),以确保将我遗漏的任何错误都发送给用户500。

如果您有一个异步函数调用(例如process.nextTick()),则它将超出express错误处理程序的范围,从而完全杀死该进程。因此,并非在所有情况下都使用快速错误处理程序。


问题答案:

Express已经具有错误处理程序实现。它从connect继承它。要使用它,您需要将其添加为最后一个中间件点(最后一次app.use(…)调用)。例如:

var express = require('express')
  , app = express();

app.use(app.router);
app.use(express.errorHandler());

// app.get(...), app.post(...), app.listen(...), etc.

如果要使用简单的500响应代码处理所有错误,则可以express.errorHandler()用自己的函数替换。在这种情况下,您的代码将如下所示:

var express = require('express')
  , app = express();

app.use(app.router);
app.use(function(err, req, res, next){
  if (!err) return next();
  res.send(500);
});

// app.get(...), app.post(...), app.listen(...), etc.

有关此方法的更多信息,请参见代码中的表达错误示例注释。

更新

当然,您可以为每个请求使用域。您可以单独包装每个请求,也可以对路由器使用包装来处理所有异常。代码如下:

var express = require('express')
    , http = require('http')
    , app = express()
    , domain = require('domain');

//app.use(app.router);
app.use(function(req, res, next){
    var d = domain.create();
    d.on('error', function(er) {
        console.log('error, but oh well', er.message);
        res.send(500);
    });

    // explicitly add req and res
    d.add(req);
    d.add(res);

    d.run(function() {
        app.router(req, res, next);
    });
});

app.get('/', function(req,res){
    process.nextTick(function(){
        throw new Error('Check Error');
    });
});

http.createServer(app).listen(3000, function(){
    console.log('Express server listening on port 3000');
});

!!但!!
切勿在生产中使用它。这样做的原因本质上是JS抛出异常的方式。这绝对是导致应用程序泄漏的原因,并使它更加不稳定。您可以使用此类错误处理来实现自定义的关机算法(例如,关闭已打开的连接)。有关正确使用域的更多信息,请参见文档。

要监视泄漏,可以使用本文中的技术。

更新2

我只是不能离开这一切。trycatch码:

var express = require('express')
    , http = require('http')
    , app = express()
    , domain = require('domain')
    , trycatch = require('trycatch');

//app.use(app.router);
app.use(function(req, res, next){
   trycatch(function(){
           app.router(req, res, next);
       }, function(er){
           console.log(er.message);
           res.send(500);
       });
});

app.get('/', function(req,res){
    process.nextTick(function(){
        throw new Error('Check Error');
    });
});

http.createServer(app).listen(3000, function(){
    console.log('Express server listening on port 3000');
});

我已经审查了的来源,trycatch没有任何魔术。仍然是泄漏的原因。trycatchdomain内幕。



 类似资料:
  • 我正在创建一个不使用数据库的服务。 我将所有的请求数据存储在文件系统中。 我正在使用spring Boot开发服务。

  • 我正在Postman中编写测试,我有多个请求分组如下: > 某些测试标题: > 创建用户(一组“预请求”): 发送一些创建用户所需的请求,这些请求是运行测试所必需的 对已创建用户的一些操作(这里我正在测试测试标题中的内容) 一个或多个请求 < li >创建用户(一组“预先请求”,与测试1中相同。): < ul > < li >发送创建用户、运行测试所需的一些请求 一个或多个请求 总的来说,当我想测

  • 如何每秒触发10个请求,而不是等待前面的线程在jmeter中完成。 需要打1000次, 当前线程组中的以下配置,用户数:10循环:100 我猜线程正在等待响应,即使在第二秒之后。 但是我需要每秒发出10个请求,不管响应如何。 恒定吞吐量计时器将有助于做到这一点?如果是这种情况,我应该提供什么配置。 非常感谢您的帮助。。

  • 问题内容: 我正在使用Square的Retrofit库进行短暂的网络调用。我在每个请求中都包含了一些数据作为参数。像这样: 必须定义并且对于中概述的每个单个端点都是很麻烦的。有没有一种方法可以设置每个请求应包含的基本参数集?类似于我们如何设置共同点? 问题答案: 您可以通过将一个自定义RequestInterceptor添加到RestAdapter来确保所有请求都具有这些查询参数。

  • AWS S3文件状态(https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html): Amazon S3会自动扩展到高请求率。例如,您的应用程序可以在存储桶中的每个前缀每秒至少实现3,500个PUT/POST/DELETE和5,500个GET请求。 为了测试这一点,我有以下NodeJS代

  • 我的方法正确吗?在正文中发送凭据>接收响应(成功)>登录成功>将令牌存储在会话存储中并将其设置在头中>会话过期时注销 存储jwt