Erreur Catch express bodyParser

Je veux attraper l'erreur du middleware bodyParser() lorsque j'envoie un objet json et qu'il n'est pas valide car je veux envoyer une réponse personnalisée au lieu d'une erreur 400 Générique.

C'est ce que j'AI et ça marche:

app.use (express.bodyParser ());
app.use (function (error, req, res, next){
    //Catch bodyParser error
    if (error.message === "invalid json"){
        sendError (res, myCustomErrorMessage);
    }else{
        next ();
    }
});

Mais cela me semble une approche très laide car je compare le message d'erreur qui pourrait changer dans les futures versions express. Il y a un autre moyen d'attraper les erreurs bodyParser ()?

Modifier:

C'est l'erreur lorsque le corps de la requête a un json non valide:

{
  stack: 'Error: invalid jsonn    at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)n    at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)n    at IncomingMessage.EventEmitter.emit (events.js:92:17)n    at _stream_readable.js:872:14n    at process._tickDomainCallback (node.js:459:13)',
  arguments: undefined,
  type: undefined,
  message: 'invalid json',
  status: 400
}

Jolie pile imprimée:

Error: invalid json
    at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)
    at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)
    at IncomingMessage.EventEmitter.emit (events.js:92:17)
    at _stream_readable.js:872:14
    at process._tickDomainCallback (node.js:459:13)
32
demandé sur Gabriel Llamas 2013-04-04 22:50:17

5 réponses

Je pense que votre meilleur pari est de vérifier SyntaxError:

app.use(function (error, req, res, next) {
  if (error instanceof SyntaxError) {
    sendError(res, myCustomErrorMessage);
  } else {
    next();
  }
});
17
répondu robertklep 2013-04-04 18:57:56

De la réponse de @ alexander mais avec un exemple d'utilisation

app.use((req, res, next) => {
    bodyParser.json({
        verify: addRawBody,
    })(req, res, (err) => {
        if (err) {
            console.log(err);
            res.sendStatus(400);
            return;
        }
        next();
    });
});

function addRawBody(req, res, buf, encoding) {
    req.rawBody = buf.toString();
}
8
répondu Daniel Pérez 2018-06-15 15:23:28

Ok, trouvé:

BodyParser() est une fonction pratique pour json (), urlencoded () et multipart(). J'ai juste besoin d'appeler à json (), attraper l'erreur et appeler urlencoded () et multipart ().

Source BodyParser

app.use (express.json ());
app.use (function (error, req, res, next){
    //Catch json error
    sendError (res, myCustomErrorMessage);
});

app.use (express.urlencoded ());
app.use (express.multipart ());
3
répondu Gabriel Llamas 2013-04-04 19:14:51

J'ai trouvé que la vérification de SyntaxError n'était pas suffisante, donc je fais:

if (err instanceof SyntaxError &&
  err.status >= 400 && err.status < 500 &&
  err.message.indexOf('JSON')) {
    // process filtered exception here
}
1
répondu dudko 2017-01-10 11:38:59
(bodyParser, req, res) => new Promise((resolve, reject) => {
    try {
        bodyParser(req, res, err => {
            if (err instanceof Error) {
                reject(err);
            } else {
                resolve();
            }
        });
    } catch (e) {
        reject(e);
    }
})

Pare-balles. Avenir-conscient. WTFPL-sous licence. Et aussi utile w/ async/await.

1
répondu Alexander Aleksandrovič Klimov 2018-01-07 14:42:30