Pertanyaan Tangkap galat bodyParser ekspres


Saya ingin menangkap kesalahan dari middleware bodyParser () ketika saya mengirim objek json dan itu tidak valid karena saya ingin mengirim respons khusus, bukan kesalahan generik 400.

Inilah yang saya miliki dan berhasil:

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

Tapi ini bagi saya pendekatan yang sangat jelek karena saya membandingkan pesan kesalahan yang bisa berubah dalam versi ekspres di masa depan. Ada cara lain untuk menangkap kesalahan bodyParser ()?

EDIT:

Ini adalah kesalahan ketika badan permintaan memiliki json yang tidak valid:

{
  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
}

Tumpukan yang cukup dicetak:

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


asal


Jawaban:


Saya pikir taruhan terbaik Anda adalah untuk memeriksa SyntaxError:

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

17
2018-04-04 18:57



Dari jawaban @alexander tetapi dengan contoh penggunaan

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



Oke, temukan:

bodyParser () adalah fungsi kenyamanan untuk json (), urlencoded () dan multipart (). Saya hanya perlu memanggil json (), menangkap kesalahan dan memanggil urlencoded () dan multipart ().

sumber 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



Saya menemukan memeriksa SyntaxError menjadi tidak cukup, karena itu saya lakukan:

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

Anti peluru. Menyadari masa depan. WTFPL-Berlisensi. Dan juga berguna dengan / async / wait.


0
2018-01-07 14:42