nodejs 및 express로 만든 REST API에서 응답 상태 및 JSON 컨텐츠를 설정하는 올바른 방법


186

Nodejs를 가지고 놀고 작은 휴식 API를 작성하여 표현합니다. 내 질문은 응답 데이터뿐만 아니라 코드 상태를 설정하는 좋은 방법 / 최상의 방법은 무엇입니까?

약간의 코드로 설명하겠습니다 (노드를 넣지 않고 서버를 시작하는 데 필요한 코드를 표현할 것이며 관련된 라우터 방법 만 설명하겠습니다).

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  res.json(user);
});


exports.getUserById = function(id) {
  for (var i = 0; i < users.length; i++) {
    if (users[i].id == id) return users[i];
  }
};

아래 코드는 완벽하게 작동하며 Postman으로 요청을 보낼 때 다음 결과를 얻습니다. 여기에 이미지 설명을 입력하십시오

보시다시피 상태는 200으로 표시되며 이는 정상입니다. 그러나 이것이 가장 좋은 방법입니까? 반환 된 JSON뿐만 아니라 상태를 직접 설정 해야하는 경우가 있습니까? 아니면 항상 급행으로 처리됩니까?

예를 들어 방금 빠른 테스트를 수행하고 위의 get 메소드를 약간 수정했습니다.

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  if (user == null || user == 'undefined') {
    res.status(404);
  }
  res.json(user);
});

보시다시피, 배열에서 사용자를 찾지 못하면 상태를 404로 설정합니다.

이 주제에 대해 더 배우기위한 자료 / 조언은 환영합니다.


3
? 나는 그것이 잠시이었다 알고 있지만,이 문제가 해결 되었습니까, 이것은 나의 가장 높은 평가 대답하고는 허용되지 것 :( @dukable
마이클 Dudak

@ MichałDudak : 네, 당신의 대답은 받아 들여 져야합니다. 그러나이 Dukable 사용자는 2015 년 10 월 15 일 이후 (2017 년 7 월 31 일부터) 활성 상태가 아닙니다. 어쨌든 당신의 대답에 +1;)
Amol M Kulkarni

답변:


230

Express API 참조는이 경우를 다룹니다.

statussend를 참조하십시오 .

즉, 당신은 단지 전화를해야 status호출하기 전에 방법을 json또는 send:

res.status(500).send({ error: "boo:(" });

32
상태 코드 (데이터 없음) 만 보내려면 방법은 다음과 같습니다res.sendStatus(400);
internet-nico

3
이것은 더 이상 작동하지 않는 것 같습니다. 응답은 올바른 상태 코드와 함께 전송되지만 본문은 없습니다 ....
LondonRob

2
마지막 코멘트는 무시하십시오. 상태를 204 (콘텐츠 없음)로 설정하면 본문을 보내지 않습니다.
LondonRob

2
@ internet-nico res.sendStatus(400);는 문자열 데이터도 전송합니다.res.status(400).send('Not Found')
Davide

74

이런 식으로 할 수 있습니다.

res.status(400).json(json_response);

이것은 HTTP 상태 코드를 400으로 설정하며 Express 4에서도 작동합니다.


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead 그래서 res.status(400).json(json_response)요즘 정확한 것입니다.
Will Luce

예, 감사합니다 ... 더 이상 사용되지 않는 것으로 표시되었지만 여전히 작동합니다. : P 귀하의 의견은 유효합니다.
mzalazar


41

사용하는 경우 (200)의 상태가 기본값이됩니다 res.send, res.json

당신은 같은 상태를 설정할 수 있습니다 res.status(500).json({ error: 'something is wrong' });

종종 나는 다음과 같은 일을 할 것입니다 ...

router.get('/something', function(req, res, next) {
  // Some stuff here
  if(err) {
    res.status(500);
    return next(err);
  }
  // More stuff here
});

그런 다음 오류 미들웨어가 응답을 보내도록하고 오류가있을 때 수행해야 할 다른 작업을 수행하십시오.

또한 res.sendStatus(status)버전 4.9.0 부터 추가되었습니다 . http://expressjs.com/4x/api.html#res.sendStatus


23

HTTP 상태 코드 목록

상태 응답에 대한 모범 사례는 실제 JSON 응답에 대해 오류 (성경)가 없지만 오류에 따라 적절한 HTTP 상태 코드를 전송하는 것입니다 (예 : 클라이언트 오류의 경우 4xx, 서버 오류의 경우 5xx). 성공적인 응답으로 루트 객체의 두 가지 속성으로 상태와 데이터를 다시 전송하는 방법 (클라이언트에게 HTTP 헤더 페이로드 자체 에서 상태를 캡처 할 수있는 기회를 제공함 )과 오류가 발생할 경우 사람이 이해할 수있는 방식으로 오류가 발생합니다.

Stripe의 API는 실제 환경에서 유사하게 작동합니다.

확인

200, {status: 200, data: [...]}

오류

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}

13

내 Express.js 응용 프로그램에서 이것을 사용하고 있습니다 :

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});

5

다음 속성을 포함하는 전체 HttpResponse를 얻는 표준 방법

  1. body // 데이터가 들어 있습니다
  2. 헤더
  3. 확인
  4. 상태
  5. statusText
  6. 유형
  7. url

백엔드 , 이렇게

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

프런트 엔드 예에서 Angular, 단지 수행

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})


2
try {
  var data = {foo: "bar"};
  res.json(JSON.stringify(data));
}
catch (e) {
  res.status(500).json(JSON.stringify(e));
}

0

당신은 이것을 할 수 있습니다

            return res.status(201).json({
                statusCode: req.statusCode,
                method: req.method,
                message: 'Question has been added'
            });

0

오류 응답을 보내는 가장 좋은 방법은 return res.status(400).send({ message: 'An error has occurred' })입니다.

그런 다음 프론트 엔드에서 다음과 같은 것을 사용하여 잡을 수 있습니다.

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

err보낸 메시지 개체가에 있으므로 로깅 만 작동하지 않습니다 err.response.data.

희망이 도움이됩니다!

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