4

Ниже приведен метод, который я использую для обработки/регистрации всех возможных исключений в приложении Express. Любым другим путем?Любой другой метод обработки исключений в узле Express?

Ошибка обработки это деликатная проблема, особенно при работе с Express. Начнем с самого простого сценария. Представьте себе, что наше приложение является следующее:

console.log(ciao.ciao); // EEERRROOORRR 

Запуск приложения из консоли мы получаем следующее:

console.log(ciao.ciao); 
      ^
ReferenceError: ciao is not defined 

Обратите внимание, что выше случае это пример ООН неперехваченного исключения в связи с тем, что не существует кода, написанного нами, выполненного в результате ошибки. Для обработки ошибки выше, мы могли бы сделать следующее:

process.on('uncaughtException', function (err) {  
    console.log('error', ' * we did it, we handled the error * ', err.stack.trim());  
    process.exit(1);  
}); 

console.log(ciao.ciao);  // EEERRROOORRR 

Если мы запустим теперь приложение мы получаем:

error * we did it, we handled the error * ReferenceError: ciao is not defined 

Внимание !!! «process.on (« uncaughtException »...» будет DEPRACATED !!!

Для того, чтобы быть готовым к тому, что произойдет сдержанность, нам лучше использовать обработчик исключений нашего любимого регистратора, который является мощным и . сверхпопулярной Winston Наше приложение становится:

var winston = require('winston'); 

var logger = new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)({ handleExceptions: true }), 
    ] 
}); 

console.log(ciao.ciao);   // EEERRROOORRR 

и его вывод состоит в следующем:

error: uncaughtException: ciao is not defined date=Wed Oct 22 2014 16:26:53 GMT+0200 (ora legale Europa occidentale), pid=8052, uid=null, gid=null, cwd=c:\Projects\Eclipse\WEBSITE\node_taxiapplication, execPath=C:\Program Files\nodejs\node.exe, version=v0.10.26, argv=[node, c:\Projects\Eclipse\WEBSI 
TE\node_taxiapplication\test2.js], rss=13479936, heapTotal=7130752, heapUsed=2760024, loadavg=[0, 0, 0],... 

великий Winston выводит много значимой информации, чтобы помочь нам управлять ошибки, которые взглянуть на параметр pid или в памятке y информации (rss, heapTotal, ...). Еще одна хорошая вещь, сделанная winston - выйти из приложения, которое хорошо в случае неперехваченного исключения.

Давайте сделаем наше приложение Сервер Экспресса Нашего приложения становится:

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

var logger = new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)({ handleExceptions: true }), 
    ] 
}); 

app.get('/', function(req, res, next) { 
    console.log(ciao.ciao);   // EEERRROOORRR 
}); 

app.listen(3000); 

Запуск сервера и просит браузер http://localhost:3000 мы получаем в браузере:

ReferenceError: ciao is not defined at Object.handle (c:\Projects\Eclipse\WEBSITE\node_taxiapplicatio... 

и приложении он по-прежнему работает, что не является хорошей идеей, когда на веб-сервере есть ошибка.

Где, черт возьми, используется Winston Exception Handler?

Уинстон не обработал ошибку выше, потому что это было обработано с помощью Express, это связано с тем, что ошибка находится в области видимости обработчика маршрута Экспресс, который следует:

function(req, res, next) { 
    console.log(ciao.ciao);   // EEERRROOORRR 
}); 

So winston is out of the game in case of error inside of an Express route handler 

Что мы хотим для достижения этой ошибки также следует использовать эту ошибку, используя winston и приложение для выхода, но для достижения нашей цели нам нужен наш код для выполнения, когда возникает ошибка «внутри» Express.Для этого мы будем использовать Экспресс ошибки промежуточным ПО следующим образом:

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

var logger = new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)({ handleExceptions: true }), 
    ] 
}); 

app.get('/', function(req, res, next) { 
    console.log(ciao.ciao);   // EEERRROOORRR 
}); 

app.use(function(err, req, res, next) { 
    logger.log('error', ' * logged by winston * ', err.stack.trim()); 

    process.exit(1); 
}); 

app.listen(3000); 

Если мы просим в наш браузер http://localhost:3000 мы получаем, что выход из приложения и на консоли мы получаем следующее, который забросил Уинстон:

error: * logged by winston * ReferenceError: ciao is not defined 

К сожалению, в этом случае мы не сможем получить всю информацию, которая выводится winston, когда он непосредственно обрабатывает исключение, но в списке мы также контролируем ошибки, обрабатываемые Express.

Но я хочу всю информацию, данные Winston, если она обрабатывает непосредственно за исключением

Хорошо, давайте попробуем! Мы должны найти способ заставить Экспресс потерять контроль над Исключением. Выше мы говорили, что Экспресс обрабатывает исключения, когда это происходит в рамках обработчика маршрута:

app.get('/', function(req, res, next) { 
    console.log(ciao.ciao); 
}); 

Давайте посмотрим, что происходит, когда ошибка происходит внутри асинхронной функции, содержащейся в обработчике маршрута Экспресс:

app.get('/', function(req, res, next) { 
    setTimeout(function() { 
     console.log(ciao.ciao); 
    }); 
}); 

Запуск приложения:

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

var logger = new (winston.Logger)({ 
         transports: [ new (winston.transports.Console)({ handleExceptions: true }) ] 
}); 

app.get('/', function(req, res, next) { 
    setTimeout(function() { 
     console.log(ciao.ciao);        // EEERRROOORRR 
    }, 1); 
}); 

app.listen(3000); 

и запрашивающий http://localhost:3000 мы наблюдаем приложение выхода и на консоли:

error: uncaughtException: ciao is not defined date=Thu Oct 23 2014 09:52:01 GMT+0200 (ora legale Europa occidentale), pid=5952, uid=null, gid=null, cwd=c:\Projects\Eclipse\WEBSITE\node_taxiapplication, execPath=C:\Program Files\nodejs\node.exe, version=v0.10.26, argv=[node, c:\Projects\Eclipse\WEBSI 
TE\node_taxiapplication\test2.js], rss=18325504, heapTotal=15453568, heapUsed=4883192, 

Hej, Express не обработал вышеуказанную ошибку, но winston сделал (у нас есть данные о памяти на выходе). Это связано с тем, что ошибка не возникала внутри области Express, но внутри области асинхронной функции. Следовательно, нам нужно преобразовать ошибку в области Express в ошибке в области асинхронной функции. Hej мы можем это сделать, ведь мы уже можем запустить наш код для управления ошибкой Express. Наша стратегия заключается в вставке асинхронного setTimeout (задержка 1 мс) внутри промежуточного программного обеспечения Express (где есть наш код для обработки ошибок Express) и внутри setTimeout для того, чтобы выдать ту же ошибку, что и в качестве промежуточного программного обеспечения.

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

var logger = new (winston.Logger)({ 
         transports: [ new (winston.transports.Console)({ handleExceptions: true }) ] 
}); 

app.get('/', function(req, res, next) { 
     console.log(ciao.ciao);        // EEERRROOORRR 
}); 

app.use(function(err, req, res, next) { 
    res.send('Arrrghhh!!! The Server is at the moment down.'); 
    setTimeout(function() { 
     throw new Error(err.stack.trim());         // <<<--- TRICK 
    }, 1); 
}); 

app.listen(3000); 

запрашивающая http://localhost:3000 мы имеем на браузере ответ «Arrrghhh !!! ...», приложение закрывается и на консоли мы получим:

error: uncaughtException: ReferenceError: ciao is not defined date=Thu Oct 23 2014 10:00:51 GMT+0200 (ora legale Europa occidentale), pid=5792, uid=null, gid=null, cwd=c:\Projects\Eclipse\WEBSITE\node_taxiapplication, execPath=C:\Program Files\nodejs\node.exe, version=v0.10.26, argv=[node, c:\Projec 
ts\Eclipse\WEBSITE\node_taxiapplication\test2.js], rss=18489344, heapTotal=15453568, heapUsed=5115092,... 

Мы получили, что все ошибки logged/managed через winston: приложение выходит, и журнал ошибок содержит много полезной информации, которая могла бы помочь в решении проблемы.

ответ