programing

Express.js를 사용하여 HTTP 오류 코드를 지정하는 방법은 무엇입니까?

batch 2023. 5. 31. 18:30
반응형

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

따라서 오류 출력 형식은 항상 동일합니다.

PS: 물론 다음과 같은 표준 오류를 확장하는 개체를 만들 수 있습니다.

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

익스프레스 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 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);
}

일부(아마도 이전 버전의) express와 함께 번들된 errorHandler 미들웨어 버전에 상태 코드가 하드 코딩된 것 같습니다.여기에 문서화된 버전: http://www.senchalabs.org/connect/errorHandler.html 에서는 원하는 작업을 수행할 수 있습니다.따라서 최신 버전의 express/connect로 업그레이드를 시도해 볼 수 있습니다.

나는 노력했다.

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

...하지만 그것은 에게 오류를 주었습니다.

(노드:208) 처리되지 않은 약속거부 경고: 오류:헤더를 보낸 후에는 헤더를 설정할 수 없습니다.

나를 위한 이 일

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

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

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

사용되지 않는 익스프레스res.send(body, status).

사용하다res.status(status).send(body)또는res.sendStatus(status)대신

문자열 표현 없이 상태 코드를 보내려면 다음을 수행할 수 있습니다.

res.status(200).send();

저는 붐 패키지를 사용하여 http 오류 코드 전송을 처리하는 것을 추천합니다.

비동기식:

  myNodeJs.processAsync(pays)
        .then((result) => {
            myLog.logger.info('API 200 OK');
            res.statusCode = 200;
            res.json(result);
            myLog.logger.response(result);
        })
        .fail((error) => {
            if (error instanceof myTypes.types.MyError) {
                log.logger.info(`My Custom Error:${error.toString()}`);
                res.statusCode = 400;
                res.json(error);
            } else {
                log.logger.error(error);
                res.statusCode = 500;
                // it seems standard errors do not go properly into json by themselves
                res.json({
                    name: error.name,
                    message: error.message
                });
            }
            log.logger.response(error);
        })
        .done();

언급URL : https://stackoverflow.com/questions/10563644/how-to-specify-http-error-code-using-express-js

반응형