Как я могу обернуть каждый экспресс-запрос js в домен или trycatch

Можно ли обернуть каждый запрос, проходящий через express.js, в domain или trycatch см. информацию о trycatch здесь?

Я пытаюсь создать "уловки всех" (промежуточное программное обеспечение обработчика ошибок не вызывает асинхронные вызовы), чтобы убедиться, что ошибки, которые я пропустил, обрабатываются с отправлением 500 пользователю.

Если у вас есть вызов асинхронной функции (например, process.nextTick()), то он будет выходить за пределы выраженного обработчика ошибок, тем самым полностью уничтожив процесс. Таким образом, использование экспресс-обработчика ошибок не будет работать во всех случаях.

Ответ 1

Экспресс уже имеет реализацию обработчика ошибок. Он наследует его от 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.

Более подробную информацию об этом можно найти в выразить пример ошибки в коде

UPDATE

Конечно, вы можете использовать домен для каждого запроса. Вы можете обернуть каждый запрос отдельно или использовать упаковку для маршрутизатора для обработки ВСЕХ исключений. Код выглядит следующим образом:

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 и не было никакой магии. Это по-прежнему является причиной утечек. trycatch имеет domain под капотом.