Express. js игнорировать SyntaxError в случае неизвестного маршрута - PullRequest
1 голос
/ 27 мая 2020

В приложении express ниже:

  • Выполнение POST для / pu sh с недопустимыми данными json приведет к отправке ошибки HTTP 400 обратно в client

  • Выполнение POST с действительными json данными, но для неизвестного маршрута приведет к отправке клиенту ошибки HTTP 404

  • Выполнение POST с недопустимыми json данными для неизвестного маршрута приведет к отправке клиенту ошибки HTTP 400.

Чего я хотел бы достичь, заключается в том, что в третьем сценарии также будет отправлено 404. Другими словами, в случае, если маршрут неизвестен, я хочу, чтобы его перехватил app.post ('*', (req, res, next)), который выбрасывает 404, а не промежуточное ПО generi c обработчик ошибок, который выдает ошибку 400 json SyntaxError

Каким-либо способом добиться этого?

const express = require('express');
const { handleError, ErrorHandler } = require('./helpers/error');

const app = express();

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

app.get('/', function(req, res){
    res.send('Hello World');
});

app.post('/', function(req, res){
    console.log(req.body.data);
    res.sendStatus(200);
});

app.post('/push', function(req, res){
    console.log('push API');
    res.sendStatus(200);
});

app.post('*',(req, res, next) => {
    console.log('Unknown route');
    throw new ErrorHandler(404, 'API endpoint does not exist.');
   });

app.use((err, req, res, next) => {
    console.log('Middleware error handling');
    handleError(err, res);
});

app.listen(3000, function(){
    console.log('Server started on port 3000')
});

error. js content:

class ErrorHandler extends Error {
    constructor(statusCode, message) {
      super();
      this.statusCode = statusCode;
      this.message = message;
    }
  }

const handleError = (err, res) => {
    const { statusCode, message } = err;
    res.status(statusCode).json({
      status: "error",
      statusCode,
      message
    });
};

module.exports = {
    ErrorHandler,
    handleError
}

1 Ответ

0 голосов
/ 27 мая 2020

При отправке запроса на несуществующий маршрут ни один из ваших обработчиков не соответствует. Таким образом, ваше промежуточное ПО обработки ошибок

app.use((err, req, res, next) => {
    console.log('Middleware error handling');
    handleError(err, res);
});

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

const handleError = (err, res) => {
    let {statusCode, message} = err;

    if (err.status === 400 && err.message.includes("Unexpected token")) {
        statusCode = 404;
    }

    res.status(statusCode).json({
        status: "error",
        statusCode,
        message
    });
};

EDIT:

Проблема может быть решена только с помощью промежуточного программного обеспечения json -parser для маршрутов, которые вы хотите проанализировать, json и удаления его как общее промежуточное ПО для всех запросов:

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

app.post('/', express.json(), function (req, res) {
    console.log(req.body.data);
    res.sendStatus(200);
});

app.post('/push', express.json(), function (req, res) {
    console.log('push API');
    res.sendStatus(200);
});
...