zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

Nodejs服务器 实现 操作 轻松 创建 阻塞
2023-06-13 09:15:37 时间

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

我们先对server.js做出修改:

复制代码代码如下:


varhttp=require("http");
varurl=require("url");
functionstart(route,handle){
 functiononRequest(request,response){
 varpathname=url.parse(request.url).pathname;
 console.log("Requestfor"+pathname+"received.");
 route(handle,pathname,response);
 }
 http.createServer(onRequest).listen(8888);
 console.log("Serverhasstarted.");
}
exports.start=start;

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

接下来修改router.js:

复制代码代码如下:


functionroute(handle,pathname,response){
 console.log("Abouttoroutearequestfor"+pathname);
 if(typeofhandle[pathname]==="function"){
 handle[pathname](response);
 }else{
 console.log("Norequesthandlerfoundfor"+pathname);
 response.writeHead(404,{"Content-Type":"text/plain"});
 response.write("404Notfound");
 response.end();
 }
}
exports.route=route;

同样的模式:相对此前从请求处理程序中获取返回值,这次取而代之的是直接传递response对象。如果没有对应的请求处理器处理,我们就直接返回“404”错误。

接下来修改requestHandler.js:

复制代码代码如下:
varexec=require("child_process").exec;
functionstart(response){
 console.log("Requesthandler"start"wascalled.");
 exec("ls-lah",function(error,stdout,stderr){
 response.writeHead(200,{"Content-Type":"text/plain"});
 response.write(stdout);
 response.end();
 });
}
 
functionupload(response){
 console.log("Requesthandler"upload"wascalled.");
 response.writeHead(200,{"Content-Type":"text/plain"});
 response.write("HelloUpload");
 response.end();
}
 
exports.start=start;
exports.upload=upload;

我们的处理程序函数需要接收response参数,为了对请求作出直接的响应。start处理程序在exec()的匿名回调函数中做请求响应的操作,而upload处理程序仍然是简单的回复“HelloWorld”,只是这次是使用response对象而已。

如果想要证明/start处理程序中耗时的操作不会阻塞对/upload请求作出立即响应的话,可以将requestHandlers.js修改为如下形式:

复制代码代码如下:
varexec=require("child_process").exec;
functionstart(response){
 console.log("Requesthandler"start"wascalled.");
 exec("find/",
     {timeout:10000,maxBuffer:20000*1024},
     function(error,stdout,stderr){
  response.writeHead(200,{"Content-Type":"text/plain"});
  response.write(stdout);
  response.end();
     }
 );
}
 
functionupload(response){
 console.log("Requesthandler"upload"wascalled.");
 response.writeHead(200,{"Content-Type":"text/plain"});
 response.write("HelloUpload");
 response.end();
}
 
exports.start=start;
exports.upload=upload;

这样一来,当请求http://localhost:8888/start的时候,会花10秒钟的时间才载入,而当请求http://localhost:8888/upload的时候,会立即响应,纵然这个时候/start响应还在处理中。