Следующее (ошибочное) сообщение обработчика в express. js - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в обработке ошибок в express, и у меня есть простой кусок кода, подобный так:

const express = require('express');
const MongoClient = require('mongodb').MongoClient;

const app = express();

let url = 'mongodb://localhost:27017';

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.use((err,req,res,next) => {
    console.log(`The error message is ${err}`)
    res.status(err.httpStatusCode).send('SOMETHING BROKE!');
})

app.get('/',function(req,res,next){
    MongoClient.connect(url,function(error,client){
        if(error){
            error.httpStatusCode = 500;
            return next(error);
        }
        res.send('Connected successfully!');
    })
})

Я отключил соединение с mongodb, так что это не удается. Ошибка отображается, и приложение не обрабатывает sh, но я не получаю "SOMETHING BROKE" или часть console.log (), как ожидалось от моего обработчика ошибок express. Куда я иду с этим не так?

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

положить промежуточное ПО обработки ошибок, наконец, Express обработка ошибок

app.get('/',function(req,res,next){
    MongoClient.connect(url,function(error,client){
        if(error){
            error.httpStatusCode = 500;
            return next(error);
        }
        res.send('Connected successfully!');
    })
})

app.use((err,req,res,next) => {
    console.log(`The error message is ${err}`)
    res.status(err.httpStatusCode).send('SOMETHING BROKE!');
})
1 голос
/ 04 мая 2020

Когда вы вызываете next(err) в Express, это отправляет обработчику ошибок Express по умолчанию, который не очень хорош.

Но обычно вы предоставляете собственный обработчик ошибок который выглядит следующим образом:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  // send your own custom error response here
  res.status(somethingAppropriate).send("something here");
});

Об этом типе Express обработки ошибок можно прочитать здесь в Express do c. Это определенный тип промежуточного программного обеспечения c с четырьмя аргументами вместо обычных трех и с аргументом err первым. Кроме того, необходимо go последний в ваших определениях маршрутизаторов и промежуточного программного обеспечения (поэтому он обрабатывается последним).


Вам также не нужно централизовать обработку ошибок. Я нахожу это много раз, я хочу отправить очень точную ошибку c в контекст, в котором произошла ошибка. В этом случае я просто улавливаю ошибку в обработчике маршрута, где она произошла, и отправляю ответ об ошибке прямо отсюда.

Например, вы можете сделать это:

app.get('/',function(req,res,next){
    MongoClient.connect(url,function(error,client){
        if(error){
            res.status(500).send("Database offline - notify system administrator or please try back shortly");
        } else {
            res.send('Connected successfully!');
        }
    })
})
...