javascript – 如何在域或trycatch中包装每个express js请求

前端之家收集整理的这篇文章主要介绍了javascript – 如何在域或trycatch中包装每个express js请求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通过express.js中的每个请求可能包含在一个域或者是一个trycatch see trycatch info here中?

我正在尝试创建一个“捕获所有”(快速错误处理程序中间件不捕获异步调用),以确保我错过的任何错误都被处理,并将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(...),etc.

有关这种方式的更多信息可以在代码中的express error example评论中找到

更新:

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

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

//app.use(app.router);
app.use(function(req,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,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如何投掷工作.这肯定会导致您的应用程序泄漏,并使其更加不稳定.您可以使用这种错误处理来实现关闭自定义算法(例如关闭已经打开的连接).有关域的正确使用的更多信息,请参阅documentation.

要监测泄漏,您可以使用this article的技术.

更新2:

我只是不能离开这个没有完成. trycatch代码

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

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

app.get('/',function(){
    console.log('Express server listening on port 3000');
});

我已经审查了一个三要素的来源,没有任何魔法.它仍然是泄漏的原因. trycatch有一个域名在引擎盖下.

原文链接:https://www.f2er.com/js/153268.html

猜你在找的JavaScript相关文章