HTTP hata kodu nasıl belirlenir?


161

Denedim:

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

ve:

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

ancak her zaman 500 hata kodu bildirilir.


1
İlgili bir soruya cevabım yardımcı olabilir: stackoverflow.com/questions/10170857/…
Pickels

2
Lütfen kabul edilen yanıtı güncelleyebilir misiniz?
Dan Mandle

Yanıtlar:


293

Express (Sürüm 4+) dokümanlarına göre şunları kullanabilirsiniz:

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

37
API'nın en son sürümünü kullanmak için +1. Telden daha fazlasını göndermek istiyorsanız, sadece zincirleyin:res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel, bir yanıt değişkeniniz yoksa, bir yanıt gönderemezsiniz.
Dan Mandle

1
Bunların hepsi artık kullanımdan kaldırıldı, kullanmalısınız res.sendStatus(401);.
Cipi

1
Eğer biterse bu cevap çok daha eksiksiz olurdu res.send('Then you shall die').
goodvibration

1
@Cipi Bunun için bir kaynağınız var mı? Belgeler .status()kullanımdan kaldırıldığını göstermiyor. .sendStatus()yalnızca verilen standart HTTP yanıt metninin .status(code).send(codeName)olduğu bir kısayol . codeNamecode
James Coyle

78

Basit bir astar;

res.status(404).send("Oh uh, something went wrong");

20

Hata yanıtının oluşturulmasını şu şekilde merkezileştirmek istiyorum:

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

Yani her zaman aynı hata çıktı formatına sahibim.

PS: tabii ki standart hatayı genişletmek için bir nesne oluşturabilirsiniz :

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

16

Sen kullanabilirsiniz res.send('OMG :(', 404);sadeceres.send(404);


Ancak hata kodunun eventHandler ara katman yazılımına gönderilmesini istiyorum, bu yüzden ekspresin özel hata sayfası görüntülenecektir.
tech-man

12
2016'da bunu okuyan herkes için: Express 4.x uyarınca res.send(404), kullanımdan kaldırılmıştır. Şimdi res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm

12

Ekspres 4.0'da doğru anladılar :)

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')

11

Express'in bazı (belki de daha eski?) Sürümleriyle birlikte gelen errorHandler ara katman yazılımının sürümü, durum kodunun sabit kodlanmış gibi görünüyor. Burada belgelenen sürüm: http://www.senchalabs.org/connect/errorHandler.html diğer taraftan yapmaya çalıştığınız şeyi yapmanızı sağlar. Yani, belki ekspres / connect son sürümüne yükseltmeye çalışıyor.


9

Express 4.0'da gördüğüm kadarıyla bu benim için çalışıyor. Bu kimlik doğrulama gerekli ara katman yazılımı örneğidir.

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

8

Eski bir soru, ama yine de Google'da geliyor. Express'in (3.4.0) geçerli sürümünde, sonraki (err) öğesini çağırmadan önce res.statusCode öğesini değiştirebilirsiniz:

res.statusCode = 404;
next(new Error('File not found'));

Sırada ne var?
Steve K

nextexpress.js dosyasında genellikle hata sayfaları oluşturmaya çalışan bir sonraki işleyiciyi çağırıyor.
Kurotsuki

2

kullanımdan kaldırılmış res.send'i (gövde, durum) ifade eder. Bunun yerine res.status (status) .send (body) kullanın


2

denedim

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

..ama bana hata veriyordu :

(düğüm: 208) UnhandledPromiseRejectionWarning: Hata: Başlıklar gönderildikten sonra ayarlanamıyor.

Bu iş benim için

res.status(400).send(yourMessage);

0

Boom paketini kullanarak http hata kodlarının gönderilmesini tavsiye ederim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.