Pregunta Catch express bodyParser error


Quiero detectar el error del middleware bodyParser () cuando envío un objeto json y no es válido porque quiero enviar una respuesta personalizada en lugar de un error 400 genérico.

Esto es lo que tengo y funciona:

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

Pero esto me parece un enfoque muy feo porque estoy comparando el mensaje de error que podría cambiar en futuras versiones expresas. ¿Hay alguna otra forma de detectar los errores de bodyParser ()?

EDITAR:

Este es el error cuando el cuerpo de la solicitud tiene un json no válido:

{
  stack: 'Error: invalid json\n    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:14\n    at process._tickDomainCallback (node.js:459:13)',
  arguments: undefined,
  type: undefined,
  message: 'invalid json',
  status: 400
}

Bonita pila impresa:

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
2018-04-04 18:50


origen


Respuestas:


Creo que tu mejor opción es verificar SyntaxError:

app.use(function (error, req, res, next) {
  if (error instanceof SyntaxError) {
    sendError(res, myCustomErrorMessage);
  } else {
    next();
  }
});

17
2018-04-04 18:57



De la respuesta de @alexander pero con un ejemplo de uso

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

6
2018-02-15 17:38



Ok, lo encontré

bodyParser () es una función de conveniencia para json (), urlencoded () y multipart (). Solo necesito llamar a json (), detectar el error y llamar a urlencoded () y multipart ().

fuente de 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
2018-04-04 19:14



Encontré buscando SyntaxError no es suficiente, por lo tanto, hago:

if (err instanceof SyntaxError &&
  err.status >= 400 && err.status < 500 &&
  err.message.indexOf('JSON')) {
    // process filtered exception here
}

1
2018-01-10 11:38



(bodyParser, req, res) => new Promise((resolve, reject) => {
    try {
        bodyParser(req, res, err => {
            if (err instanceof Error) {
                reject(err);
            } else {
                resolve();
            }
        });
    } catch (e) {
        reject(e);
    }
})

A prueba de balas. Consciente del futuro Licencia WTFPL. Y también útil w / async / await.


0
2018-01-07 14:42