code

"res.send"후에 코드를 실행할 수있는 이유는 무엇입니까?

codestyles 2020. 11. 17. 08:07
반응형

"res.send"후에 코드를 실행할 수있는 이유는 무엇입니까?


다음 코드의 동작 뒤에있는 메커니즘이 무엇인지 궁금합니다.

res.send(200, { data: 'test data' });
console.log('still here...');

내 이해는 함수를 반환res.send 하지 않지만 연결을 닫거나 요청을 종료한다는 것 입니다. 이것은 명령 후에도 여전히 코드를 실행할 수있는 이유를 설명 할 수 있습니다 (익스프레스 소스를 살펴 보았는데 비동기 함수가 아닌 것 같습니다).res.send

내가 놓칠 수있는 다른 것이 있습니까?


물론 endHTTP 응답을 종료하지만 코드에 특별한 작업을 수행하지는 않습니다.

응답을 종료 한 후에도 다른 작업을 계속할 수 있습니다.

하지만 수없는 것은 res. 응답이 종료되었으므로 더 많은 데이터를 쓸 수 없습니다.

res.send(...);
res.write('more stuff'); // throws an error since res is now closed

이 동작은 HTTP 요청에 스레드를 할당하고 응답이 끝나면 스레드를 종료하는 다른 기존 프레임 워크 (PHP, ASP 등)와는 다릅니다. ASP와 같은 동등한 함수를 호출하면 Response.End스레드가 종료되고 코드 실행이 중지됩니다. 노드에는 중지 할 스레드가 없습니다. reqres(에 통화 방법을 시도하지 않는 한 너무 오래 더 이상 이벤트를 발생하지만 콜백의 코드가 실행 계속 무료로하지 않습니다 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

반응형