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