2013-03-28 4 views
18

Я пытаюсь получить обработку ошибок, работающих с выражением, но вместо того, чтобы видеть ответ «error !!!» как я ожидаю, я вижу «какое-то исключение» на консоли, а затем процесс убит. Является ли это тем, как должна быть настроена обработка ошибок, и если есть другой способ уловить ошибки?Экспресс js обработка ошибок

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

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 

ответ

23

Пример приложения/руководство по обработке ошибок можно найти на https://expressjs.com/en/guide/error-handling.html Однако следует исправить код:

// Require Dependencies 
var express = require('express'); 
var app = express(); 

// Middleware 
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter) 
app.use(function(err, req, res, next) { 
    if(!err) return next(); // you also need this line 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

// Routes 
app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

// Listen 
app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 
+8

Для людей из будущего app.router устарел для процесса миграции 3.x => 4.x; см. https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x. –

7

Несколько советов:

1) Ваш код не работал потому что ваше промежуточное программное обеспечение обработчика ошибок было запущено до того, как ваш маршрут был достигнут, поэтому обработчик ошибок никогда не имел возможности передать эту ошибку. Этот стиль известен как продолжение прохождения. Поместите обработчик ошибок в стек промежуточного программного обеспечения.

2) Вы должны закрыть сервер, если у вас есть необработанная ошибка. Лучший способ сделать это, чтобы позвонить server.close(), где сервер является результатом делать var server = http.createServer(app);

Что значит, вы должны сделать что-то вроде этого:

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
    server.close(); 
}); 

Вы должны, вероятно, также тайм-аут в server.close(), в случае, если он не может выполнить (ваше приложение находится в неопределенном состоянии, в конце концов):

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 

    server.close(); 

    setTimeout(function() { 
    process.exit(1); 
    }, 3*1000); 
}); 

Я сделал библиотеку, которая делает все это для вас, и позволяет определять собственные ответы, в том числе специализированной представления ошибок, статические файлы для обслуживания и т. д. ...:

https://github.com/ericelliott/express-error-handler

+1

«Вы должны закрыть сервер»? Зачем? Нет! Тебе не следует! – fiatjaf

+0

Если у вас есть необработанная ошибка, вам абсолютно необходимо закрыть сервер, потому что ошибка может оставить приложение в неопределенном состоянии - это означает, что все может пойти не так. Отключение дает приложению возможность восстановить себя, перейдя в стабильное состояние. –

+0

, поэтому, если кто-то вызвал необработанное исключение, все приложение будет недоступно для всех?это глупо. – astroanu

2

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

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

Работал для меня :)

+0

Я бы предложил использовать 3 '=', поэтому он тоже проверяет только для хорошего habbit :) –

1

Установка экспресс-установки подключения-домен, а затем что-то вроде этого:

var express = require("express"), 
    connectDomain = require("connect-domain"), 
    app = express(), 
    errorHandler; 

// Наш обработчик ошибок

app.use(connectDomain()); 
    errorHandler = function (err, req, res, next) { 
     res.send(500, { 
      "status": "error", 
      "message": err.message 
     }); 
    console.log(err); 
}; 

Затем, когда вы настраиваете свои конечные точки, dler на конце в использовании():

app.get("/some/data", function (req, res) { 
    // ... do some stuff ... 
    res.send(200, "Yay! Happy Success!"); 
}).use(errorHandler); 
Смежные вопросы