[node.js] HTTP 오류 코드를 지정하는 방법?

나는 시도했다 :

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의 오류 코드가 발표됩니다.



답변

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


답변

간단한 하나의 라이너;

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


답변

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

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


답변

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


답변

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


답변

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


답변

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