轻松创建nodejs服务器(9):实现非阻塞操作

前端技术 2023/09/05 JavaScript

我们要将response对象(从服务器的回调函数onRequest()获取)通过请求路由传递给请求处理程序。随后,处理程序就可以采用该对象上的函数来对请求作出响应。

我们先对server.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对象作为第三个参数传递给route()函数,并且,我们将onRequest()处理程序中所有有关response的函数调都移除,因为我们希望这部分工作让route()函数来完成。

接下来修改 router.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响应还在处理中。

本文地址:https://www.stayed.cn/item/14369

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。