"res.send"후에 코드를 실행할 수있는 이유는 무엇입니까?
다음 코드의 동작 뒤에있는 메커니즘이 무엇인지 궁금합니다.
res.send(200, { data: 'test data' });
console.log('still here...');
내 이해는 함수를 반환res.send
하지 않지만 연결을 닫거나 요청을 종료한다는 것 입니다. 이것은 명령 후에도 여전히 코드를 실행할 수있는 이유를 설명 할 수 있습니다 (익스프레스 소스를 살펴 보았는데 비동기 함수가 아닌 것 같습니다).res.send
내가 놓칠 수있는 다른 것이 있습니까?
물론 end
HTTP 응답을 종료하지만 코드에 특별한 작업을 수행하지는 않습니다.
응답을 종료 한 후에도 다른 작업을 계속할 수 있습니다.
하지만 할 수없는 것은 res
. 응답이 종료되었으므로 더 많은 데이터를 쓸 수 없습니다.
res.send(...);
res.write('more stuff'); // throws an error since res is now closed
이 동작은 HTTP 요청에 스레드를 할당하고 응답이 끝나면 스레드를 종료하는 다른 기존 프레임 워크 (PHP, ASP 등)와는 다릅니다. ASP와 같은 동등한 함수를 호출하면 Response.End
스레드가 종료되고 코드 실행이 중지됩니다. 노드에는 중지 할 스레드가 없습니다. req
및 res
(에 통화 방법을 시도하지 않는 한 너무 오래 더 이상 이벤트를 발생하지만 콜백의 코드가 실행 계속 무료로하지 않습니다 res
열려 있어야 유효한 응답을 필요로).
편집 : 필요가 없을 때 값을 반환해서는 안되므로 아래에 설명 된대로 더 이상 수행하지 않습니다. 그것은 당신의 코드를 읽기 어렵게 만들고 엉망진창처럼 보입니다. 대신 return 문을 res.send()
. @slavafomin은 의견에서 이것을 잘 설명했습니다.
함수 실행을 중지하고 동시에 응답을 보내는 간단한 방법은 다음을 수행하는 것입니다.
return res.send('500', 'Error message here');
이를 통해 짧은 if
문 을 사용 하여 다음과 같은 오류를 처리 할 수 있습니다 .
if (err) {
return res.send('500', 'Error message here');
}
정확한 수익 의 res.send
기능은입니다 오브젝트 당신이 그것을 종료 후 연결의 전체 상태를 포함하는 것 (요청, 상태, 헤더 등),하지만 당신은 그것으로 아무것도되지 않기 때문에이 중요해야한다.
참고 URL : https://stackoverflow.com/questions/16180502/why-can-i-execute-code-after-res-send
'code' 카테고리의 다른 글
자바 스크립트에서 iso 날짜를 밀리 초로 변환 (0) | 2020.11.17 |
---|---|
Cygwin 오류 : "-bash : 포크 : 재시도 : 리소스를 일시적으로 사용할 수 없음" (0) | 2020.11.17 |
MVC : 비즈니스 로직을 어디에 넣을까요? (0) | 2020.11.17 |
jQuery UI 자동 완성 위젯 검색 구성 (0) | 2020.11.17 |
반사를 통해 개체의 필드를 가져 오는 방법은 무엇입니까? (0) | 2020.11.17 |