다음 코드의 동작 뒤에있는 메커니즘이 무엇인지 궁금합니다.
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
답변
가능한 솔루션은이 라이브러리입니다 : 에 마감
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();
});
});