HTTP 오류 코드를 지정하는 방법?


161

나는 시도했다 :

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

과:

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

그러나 항상 500의 오류 코드가 발표됩니다.


1
관련 질문에 대한 나의 답변은 다음과 같습니다 : stackoverflow.com/questions/10170857/…
Pickels

2
수락 된 답변을 업데이트 해 주시겠습니까?
Dan Mandle

답변:


293

Express (버전 4+) 문서에 따라 다음을 사용할 수 있습니다.

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를 사용하는 경우 +1 당신은, 와이어 아래 더 단지 체인을 보내려면 :res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel 응답 변수가 없으면 응답을 보낼 수 없습니다.
Dan Mandle

1
이것은 이제 더 이상 사용되지 않으며을 사용해야합니다 res.sendStatus(401);.
Cipi

1
이 응답은로 끝나는 경우 훨씬 더 완전 할 것입니다 res.send('Then you shall die').
goodvibration

1
@Cipi 소스가 있습니까? 이 문서 .status()는 더 이상 사용 되지 않음을 나타내지 않습니다. .sendStatus()는 주어진에 대한 표준 HTTP 응답 텍스트가있는 .status(code).send(codeName)곳의 약어입니다 . codeNamecode
James Coyle

78

간단한 하나의 라이너;

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

20

이 방법으로 오류 응답 작성을 중앙 집중화하고 싶습니다.

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

따라서 항상 동일한 오류 출력 형식이 있습니다.

추신 : 물론 다음 과 같이 표준 오류확장 하는 객체를 만들 수 있습니다 .

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

res.send('OMG :(', 404);그냥 사용할 수 있습니다res.send(404);


그러나 오류 코드가 eventHandler 미들웨어로 전송되기를 원하므로 express의 사용자 정의 오류 페이지가 표시됩니다.
tech-man

12
2016 년에이 내용을 읽는 사람 : Express 4.x에 따라 res.send(404)더 이상 사용되지 않습니다. 지금 res.sendStatus(404)입니다. expressjs.com/ko/api.html#res.sendStatus
0xRm

12

Express 4.0에서 그들은 그것을 올바르게 얻었습니다 :)

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 버전과 함께 번들로 제공되는 errorHandler 미들웨어의 버전에는 상태 코드가 하드 코딩 된 것 같습니다. 반면에 http://www.senchalabs.org/connect/errorHandler.html 에 설명 된 버전을 사용하면 수행하려는 작업을 수행 할 수 있습니다. 따라서 최신 버전의 Express / Connect로 업그레이드하려고 할 수 있습니다.


9

Express 4.0에서 본 것에서 이것은 나를 위해 작동합니다. 인증이 필요한 미들웨어의 예입니다.

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

오래된 질문이지만 여전히 Google에 나타납니다. 현재 버전의 Express (3.4.0)에서는 next (err)를 호출하기 전에 res.statusCode를 변경할 수 있습니다.

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

다음은 무엇입니까?
Steve K

nextexpress.js에서 일반적으로 오류 페이지를 렌더링하려고하는 다음 핸들러를 호출합니다.
Kurotsuki

2

더 이상 사용되지 않는 res.send (body, status)를 표현하십시오. 대신 res.status (status) .send (body)를 사용하십시오.


2

나는 시도했다

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

..하지만 오류가 발생했습니다 .

(노드 : 208) UnhandledPromiseRejectionWarning : 오류 : 헤더를 보낸 후 설정할 수 없습니다.

이것은 나를 위해 작동

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

0

Boom 패키지 를 사용하여 http 오류 코드 전송을 처리하는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.