Подтвердить что ты не робот

Экспресс-обработка ошибок js

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

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");
});
4b9b3361

Ответ 1

Пример приложения/руководства по обработке ошибок доступен в 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");
});

Ответ 2

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

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(), если он не может завершить (ваше приложение в конечном итоге находится в состоянии undefined):

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

Ответ 3

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

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

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

Ответ 4

Установка экспресс-установки connect-domain, а затем примерно следующее:

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);
};

Затем, когда вы настраиваете свои конечные точки, нажимайте errorHandler на конце в use():

app.get("/some/data", function (req, res) {  
    // ... do some stuff ...
    res.send(200, "Yay! Happy Success!");
}).use(errorHandler);