Bagaimana cara menentukan kode kesalahan HTTP?

161

Saya telah mencoba:

app.get('/', function(req, res, next) {
    var e = new Error('error message');
    e.status = 400;
    next(e);
});

dan:

app.get('/', function(req, res, next) {
    res.statusCode = 400;
    var e = new Error('error message');
    next(e);
});

tetapi selalu kode kesalahan 500 diumumkan.

orang teknologi
sumber
1
Jawaban saya untuk pertanyaan terkait dapat membantu: stackoverflow.com/questions/10170857/…
Pickels
2
Bisakah Anda memperbarui tanggapan yang diterima?
Dan Mandle

Jawaban:

293

Per dokumen Express (Versi 4+), Anda dapat menggunakan:

res.status(400);
res.send('None shall pass');

http://expressjs.com/4x/api.html#res.status

<= 3,8

res.statusCode = 401;
res.send('None shall pass');
Dan Mandle
sumber
37
+1 untuk menggunakan versi terbaru API. Jika Anda ingin mengirim lebih banyak, cukup rantai:res.status(400).json({ error: 'message' })
TyMayn
1
@Mikel jika Anda tidak memiliki variabel respons, maka Anda tidak dapat mengirim respons.
Dan Mandle
1
Ini semua sudah usang sekarang, Anda harus menggunakan res.sendStatus(401);.
Cipi
1
Respons ini akan jauh lebih lengkap jika diakhiri dengan res.send('Then you shall die').
goodvibration
1
@ Cipi Apakah Anda punya sumber untuk itu? Dokumentasi tidak menunjukkan .status()sudah usang. .sendStatus()hanyalah singkatan untuk .status(code).send(codeName)mana codeNameteks respons HTTP standar untuk yang diberikan code.
James Coyle
78

Satu liner sederhana;

res.status(404).send("Oh uh, something went wrong");
Mike P
sumber
20

Saya ingin memusatkan pembuatan respons kesalahan dengan cara ini:

app.get('/test', function(req, res){
  throw {status: 500, message: 'detailed message'};
});

app.use(function (err, req, res, next) {
  res.status(err.status || 500).json({status: err.status, message: err.message})
});

Jadi saya selalu memiliki format output kesalahan yang sama.

PS: tentu saja Anda dapat membuat objek untuk memperluas kesalahan standar seperti ini:

const AppError = require('./lib/app-error');
app.get('/test', function(req, res){
  throw new AppError('Detail Message', 500)
});

'use strict';

module.exports = function AppError(message, httpStatus) {
  Error.captureStackTrace(this, this.constructor);
  this.name = this.constructor.name;
  this.message = message;
  this.status = httpStatus;
};

require('util').inherits(module.exports, Error);
Manuel Spigolon
sumber
16

Anda bisa menggunakan res.send('OMG :(', 404);sajares.send(404);

Mustafa
sumber
Tapi saya ingin kode kesalahan dikirim ke eventHandler middleware, jadi halaman kesalahan kustom express ditampilkan.
Teknisi
12
Bagi siapa pun yang membaca ini di 2016: Sesuai Express 4.x, res.send(404)sudah usang. Sekarang res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm
12

Di express 4.0 mereka benar :)

res.sendStatus(statusCode)
// Sets the response HTTP status code to statusCode and send its string representation as the response body.

res.sendStatus(200); // equivalent to res.status(200).send('OK')
res.sendStatus(403); // equivalent to res.status(403).send('Forbidden')
res.sendStatus(404); // equivalent to res.status(404).send('Not Found')
res.sendStatus(500); // equivalent to res.status(500).send('Internal Server Error')

//If an unsupported status code is specified, the HTTP status is still set to statusCode and the string version of the code is sent as the response body.

res.sendStatus(2000); // equivalent to res.status(2000).send('2000')
Steven Spungin
sumber
11

Versi dari middleware errorHandler yang dibundel dengan beberapa (mungkin lebih tua?) Versi ekspres tampaknya memiliki kode status yang di-hardcode. Versi yang didokumentasikan di sini: http://www.senchalabs.org/connect/errorHandler.html di sisi lain memungkinkan Anda melakukan apa yang ingin Anda lakukan. Jadi, mungkin mencoba memutakhirkan ke versi terbaru express / connect.

lumba-lumba
sumber
9

Dari apa yang saya lihat di Express 4.0 ini cocok untuk saya. Ini adalah contoh otentikasi yang diperlukan middleware.

function apiDemandLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on
    console.log('isAuth', req.isAuthenticated(), req.user);
    if (req.isAuthenticated())
        return next();

    // If not return 401 response which means unauthroized.
    var err = new Error();
    err.status = 401;
    next(err);
}
Ido Ran
sumber
8

Pertanyaan lama, tetapi masih muncul di Google. Dalam versi Express saat ini (3.4.0), Anda dapat mengubah res.statusCode sebelum memanggil berikutnya (err):

res.statusCode = 404;
next(new Error('File not found'));
webarnes
sumber
Apa yang dilakukan selanjutnya?
Steve K
nextmenelpon pengendali berikutnya yang dalam express.js biasanya mencoba membuat halaman kesalahan.
Kurotsuki
2

nyatakan res.send usang (badan, status) Gunakan res.status (status) .send (body) sebagai gantinya

Rajeev Jayaswal
sumber
2

Saya mencoba

res.status(400);
res.send('message');

..tapi itu memberi saya kesalahan :

(simpul: 208) UnhandledPromiseRejectionWarning: Kesalahan: Tidak dapat mengatur header setelah dikirim.

Ini bekerja untuk saya

res.status(400).send(yourMessage);
Tarun Rawat
sumber
0

Saya akan merekomendasikan menangani pengiriman kode kesalahan http dengan menggunakan paket Boom .

JoeTidee
sumber