[node.js] “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


답변

가능한 솔루션은이 라이브러리입니다 : 에 마감

var destroy = require('destroy')
var fs = require('fs')
var http = require('http')
var onFinished = require('on-finished')

http.createServer(function onRequest (req, res) {
  var stream = fs.createReadStream('package.json')
  stream.pipe(res)
  onFinished(res, () => {
    destroy(stream)
  })
})

Express 에서도 작동 합니다. 예 :

const express = require('express');
const app = express();

app.get('/video', (req, res) => {
 const ffmpeg = spawn(ffmpegPath, argsArray);
 ffmpeg.stdout.pipe(res);
 onFinished(res, () => {
   ffmpeg.kill();
 });
});


답변