* 문제 : app.js에서 update후 응답을 2개 보냈기 때문이다. (res.json && res.redirect)
* 원래 나의 의도 : update후 다시 redirect를 보내 홈화면을 재 렌더링 하고자 했다.
app.patch('/update-task-status', (req, res) => {
const { taskId, status } = req.body;
// console.log(taskId);
// console.log(status);
const task = db.get('tasks').find({ id: taskId }).value();
if (task) {
db.get('tasks')
.find({ id: taskId })
.assign({ status: status })
.write();
db.get('history')
.push({ timestamp: new Date().toISOString(), action: `Moved task: ${task.title} to ${status}` })
.write();
res.json({ status: 'success' });
} else {
res.json({ status: 'error', message: 'Task not found' });
}
res.redirect('/');
});
* 해결 시도 : post로 클라에서 요청시도했더니 , 임시로 해결된듯했으나, 다시 error 발생함.
* 해결책 by gpt : 요청당 하나의 응답만 보내야 합니다. 문제를 해결하는 방법은 다음과 같습니다.
res.redirect('/') 문을 제거하세요 이미 JSON 응답을 보냈기 때문입니다. 리디렉션하려는 경우 클라이언트 측에서 이를 처리할 수 있습니다.
응답 방법 중 하나를 선택하세요: res.json(...) 또는 res.redirect(...) 중 하나를 사용하세요. 둘 다 사용할 수는 없습니다.
* 의문 : 1요청당 1응답이어야 하는 이유?
- http 1.1 프로토콜에서는 요청-응답이 1:1로 약속되어있음.
- 멀티 응답을 허용한다면, 첫응답이 success, 두번째응답이 fail이면 클라이언트에서 어느 응답을 믿어야하는지? 알수없음
res.json({ status: 'success' });
res.redirect('/');
나의경우) res.json을 보낸후에 자동으로 연결이 닫힘 -> 이후 res.redirect를 또 보내면 연결이 이미닫혀 error가 남.
redirect하고자한다면, 클라에서 처리할수있음.
* gpt 원본
HTTP에서는 웹 브라우저와 같은 클라이언트가 보낸 각 요청은 서버로부터 단일 응답을 기대합니다. 이는 HTTP 프로토콜이 작동하는 방식의 기본 측면입니다. 이유는 다음과 같습니다.
1. 프로토콜 사양
HTTP/1.1 사양에서는 요청-응답 모델을 일대일 상호 작용으로 정의합니다. 클라이언트가 요청한 각 요청은 서버로부터 정확히 하나의 응답을 기대합니다. 서버가 응답을 보내면 해당 요청에 대한 연결이 완료된 것으로 간주됩니다.
단일 요청에 대해 여러 응답을 보내면 HTTP 프로토콜을 위반하여 오류가 발생합니다.
2. 클라이언트 행동
클라이언트가 요청을 보내면 응답을 기다립니다. 응답을 받으면 해당 요청에 대한 추가 데이터 수신을 중지합니다. 서버가 초기 응답 이후에 더 많은 데이터를 보내려고 하면 클라이언트는 일반적으로 해당 데이터를 삭제하거나 오류를 발생시킵니다.
예를 들어 웹 브라우저에서 응답(예: HTML 페이지 또는 JSON 데이터)이 수신되면 브라우저는 해당 데이터를 처리합니다. 첫 번째 응답 이후에 전송된 추가 데이터는 무시되거나 더 나쁜 경우 브라우저가 오작동할 수 있습니다.
3. 리소스 관리
서버가 응답을 보낼 때 해당 요청과 관련된 리소스를 확보하는 경우가 많습니다. 첫 번째 응답 이후에 다른 응답을 보내면 서버가 이미 릴리스된 리소스에서 작업을 시도할 수 있으므로 예기치 않은 동작, 리소스 누수 또는 충돌이 발생할 수 있습니다.
4. 오류 처리
복수 응답이 허용되면 오류 처리가 모호해집니다. 예를 들어 첫 번째 응답이 성공을 나타내고 두 번째 응답이 실패를 나타내는 경우 클라이언트는 어느 응답을 신뢰할지 알 수 없습니다. 이로 인해 안정적인 애플리케이션을 개발하는 것이 매우 어려워집니다.
5. 네트워크 통신
HTTP는 연결과 데이터 전송을 관리하는 TCP 위에 구축됩니다. 둘 이상의 응답을 보내면 기본 TCP 계층을 혼란스럽게 하여 네트워크 문제, 연결 끊김 또는 데이터 손상을 일으킬 수 있습니다.
예시: 나의 경우:
res.json({ status: 'success' });
res.redirect('/');
첫 번째 res.json()은 클라이언트에 응답을 다시 보내고 해당 요청에 대한 연결은 기본적으로 완료됩니다.
후속 res.redirect('/')는 다른 응답을 보내려고 시도하지만 연결이 이미 닫혀 ERR_HTTP_HEADERS_SENT 오류가 발생합니다.
결론
요청-응답 모델의 무결성을 유지하려면 요청당 하나의 응답만 보내야 합니다. 이렇게 하면 클라이언트가 응답을 올바르게 수신하고 처리하며 서버가 오류 없이 예상대로 작동하도록 보장됩니다.
참고 :
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
'CS > HTTP' 카테고리의 다른 글
24.9.9. 개발일지// rest api (0) | 2024.09.09 |
---|---|
24. 9.4. 개발일지 // 커스텀 세션, 쿠키생성방법 (0) | 2024.09.04 |
24. 9. 3. 개발일지// 쿠키 (0) | 2024.09.04 |
[Http] http req에서 userId 얻는법 (0) | 2024.08.28 |
[HTTP] 클라에서 서버로 데이터 전송 과정 (0) | 2024.08.22 |