Como especificar o código de erro HTTP?

161

Eu tentei:

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

e:

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

mas sempre é anunciado um código de erro 500.

técnico
fonte
1
Minha resposta a uma pergunta relacionada poderia ajudar: stackoverflow.com/questions/10170857/...
Pickels
2
Você poderia atualizar a resposta aceita?
Dan Mandle

Respostas:

293

De acordo com os documentos do Express (versão 4+), você pode usar:

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
fonte
37
+1 para usar a versão mais recente da API. Se você quiser enviar mais pelo fio, basta encadear:res.status(400).json({ error: 'message' })
TyMayn 23/09
1
@ Mikel, se você não tiver uma variável de resposta, não poderá enviar uma resposta.
Dan Mandle
1
Agora tudo está obsoleto, você deve usar res.sendStatus(401);.
Cipi
1
Essa resposta seria muito mais completa se terminasse com res.send('Then you shall die').
goodvibration
1
@Cipi Você tem uma fonte para isso? A documentação não indica que .status()está obsoleta. .sendStatus()é apenas uma abreviação de .status(code).send(codeName)onde codeNameestá o texto de resposta HTTP padrão para o dado code.
James Coyle
78

Um forro simples;

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

Eu gostaria de centralizar a criação da resposta de erro desta maneira:

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

Então, eu sempre tenho o mesmo formato de saída de erro.

PS: é claro que você pode criar um objeto para estender o erro padrão como este:

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
fonte
16

Você pode usar res.send('OMG :(', 404);apenasres.send(404);

Mustafa
fonte
Mas quero que o código de erro seja enviado ao middleware eventHandler, para que a página de erro personalizada do express seja exibida.
tech-man
12
Para qualquer pessoa que esteja lendo isso em 2016: o Express 4.x res.send(404)está obsoleto. É agora res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm 28/06
12

No Express 4.0, eles acertaram :)

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
fonte
11

A versão do middleware errorHandler que acompanha algumas versões (talvez mais antigas?) Do express parece ter o código de status codificado. A versão documentada aqui: http://www.senchalabs.org/connect/errorHandler.html, por outro lado, permite fazer o que você está tentando fazer. Portanto, talvez esteja tentando atualizar para a versão mais recente do express / connect.

catphive
fonte
9

Pelo que vi no Express 4.0, isso funciona para mim. Este é um exemplo de middleware necessário para autenticação.

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
fonte
8

Pergunta antiga, mas ainda está chegando no Google. Na versão atual do Express (3.4.0), você pode alterar o res.statusCode antes de chamar next (err):

res.statusCode = 404;
next(new Error('File not found'));
webarnes
fonte
O que é o próximo passo?
Steve K
nextestá chamando o próximo manipulador que, no express.js, geralmente tenta processar páginas de erro.
Kurotsuki
2

expressar res.send obsoleto (corpo, status). Use res.status (status) .send (body) em vez disso

Rajeev Jayaswal
fonte
2

eu tentei

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

..mas estava me dando erro :

(nó: 208) UnhandledPromiseRejectionWarning: Erro: Não é possível definir cabeçalhos após o envio.

Esse trabalho pra mim

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

Eu recomendaria lidar com o envio de códigos de erro http usando o pacote Boom .

JoeTidee
fonte