ошибка перехвата для плохого формата json, генерируемого промежуточным ПО express.json () - PullRequest
2 голосов
/ 27 сентября 2019

Я получаю SyntaxError: Unexpected string in JSON at position 59 ошибку в формате HTML, когда формат данных JSON недопустим.Я не знаю, почему он дает мне html вместо объекта ошибки.
Я установил свой заголовок, как показано ниже.


//header middlewares
app.use((req, res, next) => {
    res.setHeader('Content-Type', 'application/json');
    res.setHeader("Access-Control-Allow-Origin", "*");
    next();
  });

Я хочу отловить ошибку и отправить сообщение вниже формат.

{ 
  "status":404,
  "message":Unexpected string in JSON at position 59
}

Вот ошибка, которую я получаю.

<code><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>SyntaxError: Unexpected string in JSON at position 59<br> &nbsp; &nbsp;at JSON.parse (&lt;anonymous&gt;)<br> &nbsp; &nbsp;at parse (C:\Users\mydirectory\auth\node_modules\body-parser\lib\types\json.js: 89: 19)<br> &nbsp; &nbsp;at C:\Users\mydirectory\auth\node_modules\body-parser\lib\read.js: 121: 18<br> &nbsp; &nbsp;at invokeCallback (C:\Users\mydirectory\auth\node_modules\raw-body\index.js: 224: 16)<br> &nbsp; &nbsp;at done (C:\Users\my-directory\auth\node_modules\raw-body\index.js: 213: 7)<br> &nbsp; &nbsp;at IncomingMessage.onEnd (C:\Users\mydirectory\auth\node_modules\raw-body\index.js: 273: 7)<br> &nbsp; &nbsp;at IncomingMessage.emit (events.js: 203: 15)<br> &nbsp; &nbsp;at endReadableNT (_stream_readable.js: 1145: 12)<br> &nbsp; &nbsp;at process._tickCallback (internal/process/next_tick.js: 63: 19)


Я пытался пойматьэта ошибка.

app.use((err, req, res, next) => {
    if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
        console.error(err);
        return res.status(400).send(err); // Bad request
    }
    next();
});


Но ответ, который я получаю сейчас, как показано ниже.

{
    "expose": true,
    "statusCode": 400,
    "status": 400,
    "body": "{\n\t\"username\":\n}",
    "type": "entity.parse.failed"
}

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

Вам придется обрабатывать ошибку разбора отдельно, как показано ниже:

app.use((err, req, res, next) => {
    if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
        if (err.type === 'entity.parse.failed') {
            let data = req.body || req.query;
            try {
                JSON.parse(data); // <-- reproduce error in order to catch it
            } catch (error) {
                // get the first line of error which is "SyntaxError: Unexpected string in JSON at position 59"
                let message = error.toString().split("\n")[0];
                return res.status(400).send({ status: 400, message: message }); // Bad request
            }
        }            
        else return res.status(400).send(err); // Bad request
    }
    next();
});
1 голос
/ 30 сентября 2019

Я разместил этот вопрос в репозитории expressjs github, и получил хорошее и разумное решение.

Если вы хотите получить конкретный ответ, это то, что вам нужно отправить в свой обработчик ошибок вместосам объект ошибки

 app.use((err, req, res, next) => {
    if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
        console.error(err);
        return res.status(400).send({ status: 404, message: err.message }); // Bad request
    }
    next();
});

Теперь я могу отправить желаемый ответ.

{
   "status": 404,
   "message": "Unexpected string in JSON at position 37"
}

Ссылка на вопрос

0 голосов
/ 27 сентября 2019

Попробуйте создать объект для хранения требуемых сведений об ошибке и вернуть их как json ...

app.use((err, req, res, next) => {
    if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
        let formattedError = {
          status: err.statusCode,
          message: err.message
        }
        return res.status(err.statusCode).json(formattedError); // Bad request
    }
    next();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...