>웹 프론트엔드 >JS 튜토리얼 >nodejs 서버를 쉽게 생성하기 (9): 비차단 작업 구현_node.js

nodejs 서버를 쉽게 생성하기 (9): 비차단 작업 구현_node.js

WBOY
WBOY원래의
2016-05-16 16:25:521422검색

요청 경로를 통해 서버의 콜백 함수 onRequest()에서 얻은 응답 객체를 요청 핸들러에 전달하려고 합니다. 그런 다음 핸들러는 해당 객체의 함수를 사용하여 요청에 응답할 수 있습니다.

먼저 server.js를 변경해 보겠습니다.

코드 복사 코드는 다음과 같습니다.

var http = require("http");
var url = require("url");
함수 시작(경로, 핸들) {
함수 onRequest(요청, 응답) {
var 경로명 = url.parse(request.url).pathname;
console.log("" 경로명 "에 대한 요청이 수신되었습니다."); 경로(핸들, 경로명, 응답)
}
http.createServer(onRequest).listen(8888);
console.log("서버가 시작되었습니다.");
}
수출.시작 = 시작;

응답 객체를 세 번째 매개변수로 Route() 함수에 전달하고 onRequest() 핸들러에서 모든 응답 관련 함수 호출을 제거합니다. 왜냐하면 이 작업 부분이 Route()에 의해 수행되기를 원하기 때문입니다. ) 기능을 완료합니다.

다음으로 router.js를 수정하세요.

코드 복사 코드는 다음과 같습니다.
함수 경로(핸들, 경로명, 응답) {
console.log("pathname에 대한 요청을 라우팅하려고 합니다.");
if (typeof 핸들[경로 이름] === '함수') {
핸들[경로명](응답);
} 그 밖의 {
console.log("경로명에 대한 요청 핸들러를 찾을 수 없습니다.");
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 찾을 수 없음");
response.end();
}
}
수출.경로 = 경로;

동일한 패턴: 요청 핸들러에서 반환 값을 가져오는 대신 이번에는 응답 개체가 직접 전달됩니다. 처리할 해당 요청 프로세서가 없으면 "404" 오류를 직접 반환합니다.

다음으로 requestHandler.js를 수정하세요.

코드 복사 코드는 다음과 같습니다.
var exec = require("child_process").exec;
함수 시작(응답) {
console.log("요청 핸들러 'start'가 호출되었습니다.");
exec("ls -lah", 함수(오류, stdout, stderr) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
});
}

함수 업로드(응답) {
console.log("요청 핸들러 '업로드'가 호출되었습니다.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("안녕하세요 업로드");
response.end();
}

수출.시작 = 시작;
수출.업로드 = 업로드;

요청에 직접 응답하려면 핸들러 함수가 응답 매개변수를 수신해야 합니다. 시작 핸들러는 exec()의 익명 콜백 함수에서 요청 응답 작업을 수행하는 반면 업로드 핸들러는 여전히 "Hello World"라고만 응답하지만 이번에는 응답 개체를 사용합니다.

/start 핸들러에서 시간이 많이 걸리는 작업이 /upload 요청에 대한 즉각적인 응답을 차단하지 않는다는 것을 입증하려면 requestHandlers.js를 다음 형식으로 수정하면 됩니다.

코드 복사 코드는 다음과 같습니다.
var exec = require("child_process").exec;
함수 시작(응답) {
console.log("요청 핸들러 'start'가 호출되었습니다.");
exec("/를 찾으세요",
{ 시간 초과: 10000, maxBuffer: 20000*1024 },
함수(오류, stdout, stderr) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
}
);
}

함수 업로드(응답) {
console.log("요청 핸들러 '업로드'가 호출되었습니다.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("안녕하세요 업로드");
response.end();
}

수출.시작 = 시작;
수출.업로드 = 업로드;

이렇게 하면 http://localhost:8888/start를 요청하면 로딩하는데 10초가 걸리지만, http://localhost:8888/upload를 요청하면 /start에도 불구하고 즉시 응답하게 됩니다. 현재 응답이 아직 처리 중입니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.