nodejs 및 express로 만든 REST API에서 응답 상태 및 JSON 내용을 올바르게 설정하는 방법
나는 Nodejs를 가지고 놀고 있고 작은 rest 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];
}
};
아래 코드는 완벽하게 작동하며, 포스트맨으로 요청을 보내면 다음과 같은 결과가 나옵니다.
보시는 것처럼 상태가 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로 설정하겠습니다.
이 주제에 대해 자세히 알아보기 위한 자료/조언은 환영할 만한 일입니다.
Express API 참조는 이 사례를 다룹니다.
상태를 확인하고 전송합니다.
간단히 말해서, 당신은 그냥 전화하면 됩니다.status
호출 전 방법json
또는send
:
res.status(500).send({ error: "boo:(" });
다음과 같은 방법으로 수행할 수 있습니다.
res.status(400).json(json_response);
이렇게 하면 HTTP 상태 코드가 400으로 설정되며, express 4에서도 작동합니다.
상태 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 기준으로 추가되었습니다. expressjs.com/4x/api.html#res.sendStatus
상태 응답과 관련된 모범 사례는 예측 가능하게 오류에 따라 적절한 HTTP 상태 코드를 보내는 것입니다(클라이언트 오류의 경우 4xx, 서버 오류의 경우 5xx).실제 JSON 응답과 관련하여 "bible"은 없지만 성공적인 응답에서 루트 개체의 두 가지 다른 속성으로 상태와 데이터를 (다시) 보내는 것이 좋은 아이디어일 수 있습니다(이렇게 하면 클라이언트가 HTTP 헤더와 페이로드 자체에서 상태를 캡처할 수 있는 기회를 제공합니다). 그리고 오류를 설명하는 세 번째 속성입니다.오류의 경우 인간이 이해할 수 있는 방법.
Stripe의 API는 실제 환경에서도 유사하게 동작합니다.
예.
네 알겠습니다
200, {status: 200, data: [...]}
오류
400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
Express.js 응용 프로그램에서 사용하고 있습니다.
app.get('/', function (req, res) {
res.status(200).json({
message: 'Welcome to the project-name api'
});
});
다음 속성을 포함하는 전체 HttpResponse를 가져오는 표준 방법
- 본문 //데이터 삭제
- 머리글
- 네 알겠습니다
- 상황
- 상태 텍스트
- 유형
- 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)
})
res.status(500).jsonp(dataRes);
try {
var data = {foo: "bar"};
res.json(JSON.stringify(data));
}
catch (e) {
res.status(500).json(JSON.stringify(e));
}
은 오응답보가는장좋은방다같다습니음과법입니다.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
.
도움이 되길 바랍니다!
당신은 할 수 있어요
return res.status(201).json({
statusCode: req.statusCode,
method: req.method,
message: 'Question has been added'
});
IIS용
iis 노드를 사용하여 IIS를 통해 nodejs를 실행하는 경우 기본적으로 IIS가 보내는 모든 오류 메시지를 대체합니다.
이 이은만당보면낸다이를 보낸다는 합니다.res.status(401).json({message: "Incorrect authorization token"})
당신은 돌아올 것입니다.You do not have permission to view this directory or page
.
.config" 아래의 web. 코드를 할 수 .<system.webServer>
(소스):
<httpErrors existingResponse="PassThrough" />
res.sendStatus(status)
4되었습니다.
당신은 이것들 중 하나를 사용할 수 있습니다.res.sendStatus()
||res.status()
아래는 사이의 차이입니다.res.sendStatus()
||res.status()
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')
누군가가 이 도움이 되는 감사함을 찾기를 바랍니다.
방법의 순서가 필요하다는 사실을 언급한 사람은 아무도 없습니다.res
객체는 중요합니다.처음입니다nodejs
그리고 처음에는 res.json()이 단순히 응답 본문을 설정하는 것 이상의 일을 한다는 것을 깨닫지 못했습니다.실제로 응답 상태도 추론하려고 합니다.: 라서할, 그게경우:
res.json({"message": "Bad parameters"})
res.status(400)
두 번째 줄은 올바르게 구축된 json을 기반으로 하기 때문에 아무 소용이 없을 것입니다.express/nodejs
여부를 입니다.200
).
언급URL : https://stackoverflow.com/questions/26066785/proper-way-to-set-response-status-and-json-content-in-a-rest-api-made-with-nodej
'programing' 카테고리의 다른 글
Bash 스크립트에서 출력을 무음화하는 방법은 무엇입니까? (0) | 2023.05.28 |
---|---|
C++에서 벡터를 초기화하는 방법 (0) | 2023.05.28 |
다른 스레드가 이 개체를 소유하고 있기 때문에 호출 스레드가 이 개체에 액세스할 수 없습니다. (0) | 2023.05.28 |
별도의 줄에서 %path% 에코 (0) | 2023.05.28 |
Xcode: 장치 지원 파일을 찾을 수 없습니다. (0) | 2023.05.28 |