nodejs 서버 쉽게 만들기(9): 비차단 작업 실현

응답 대상 (서버의 리셋 함수 onRequest () 에서 가져오기) 을 요청 루트를 통해 요청 처리 프로그램에 전달합니다.그 다음에 처리 프로그램은 이 대상의 함수를 사용하여 요청에 응답할 수 있다.
우리 먼저 서버에 대해.js 수정:

var http = require("http");
var url = require("url");
function start(route, handle) {
  function onRequest(request, response) {
 var pathname = url.parse(request.url).pathname;
 console.log("Request for " + pathname + " received.");
 route(handle, pathname, response);
  }
  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
exports.start = start;
우리는 response 대상을 세 번째 매개 변수로 루트 () 함수에 전달하고, onRequest () 처리 프로그램에서 response와 관련된 모든 함수 변조를 제거합니다. 왜냐하면 이 부분은route () 함수로 완성되기를 원하기 때문입니다.
다음은 라우터를 수정합니다.js:

function route(handle, pathname, response) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
 handle[pathname](response);
  } else {
 console.log("No request handler found for " + pathname);
 response.writeHead(404, {"Content-Type": "text/plain"});
 response.write("404 Not found");
 response.end();
  }
}
exports.route = route;
같은 모드: 이전에 요청 처리 프로그램에서 되돌아오는 값을 가져온 것에 비해 이번에는 response 대상을 직접 전달합니다.요청이 처리되지 않으면 "404"오류로 돌아갑니다.
다음은 requestHandler를 수정합니다.js:

var exec = require("child_process").exec;
function start(response) {
  console.log("Request handler 'start' was called.");
  exec("ls -lah", function (error, stdout, stderr) {
 response.writeHead(200, {"Content-Type": "text/plain"});
 response.write(stdout);
 response.end();
  });
}
 
function upload(response) {
  console.log("Request handler 'upload' was called.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello Upload");
  response.end();
}
 
exports.start = start;
exports.upload = upload;
우리의 처리 프로그램 함수는 요청에 대한 직접적인 응답을 위해response 파라미터를 받아야 합니다.start 프로세서는 exec () 의 익명 리셋 함수에서 응답을 요청하는 동작을 하고, upload 프로세서는 "Hello World"에 간단한 답장을 합니다. 이번에는response 대상을 사용할 뿐입니다.
/start 프로세서에서 소모되는 작업이/upload 요청에 대한 즉각적인 응답을 막지 않는다는 것을 증명하려면 requestHandlers를 사용하십시오.js는 다음과 같이 수정되었습니다.

var exec = require("child_process").exec;
function start(response) {
  console.log("Request handler 'start' was called.");
  exec("find /",
      { timeout: 10000, maxBuffer: 20000*1024 },
      function (error, stdout, stderr) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write(stdout);
  response.end();
      }
  );
}
 
function upload(response) {
  console.log("Request handler 'upload' was called.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello Upload");
  response.end();
}
 
exports.start = start;
exports.upload = upload;
이렇게 되면http://localhost:8888/start요청할 때 10초가 걸립니다http://localhost:8888/upload이 때에도/start 응답은 처리 중입니다.

좋은 웹페이지 즐겨찾기