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

 更新时间:2014年12月18日 10:58:09   投稿:junjie  
这篇文章主要介绍了轻松创建nodejs服务器(9):实现非阻塞操作,本系列文章会教你一步一步创建一个完整的服务器,要的朋友可以参考下

我们要将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响应还在处理中。

相关文章

  • node.js中的fs.rmdir方法使用说明

    node.js中的fs.rmdir方法使用说明

    这篇文章主要介绍了node.js中的fs.rmdir方法使用说明,本文介绍了fs.rmdir方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • nodejs处理http请求实例详解之get和post

    nodejs处理http请求实例详解之get和post

    最近一段时间在学习前端向服务器发送数据和请求数据,下面这篇文章主要给大家介绍了关于nodejs处理http请求实例详解之get和post的相关资料,需要的朋友可以参考下
    2023-01-01
  • 使用Nodejs开发微信公众号后台服务实例

    使用Nodejs开发微信公众号后台服务实例

    这篇文章主要介绍了使用Nodejs开发微信公众号后台服务实例,在这个实例中,主要使用到了express, wechat, mongodb, monk等模块,需要的朋友可以参考下
    2014-09-09
  • Node.js log4js日志管理详解

    Node.js log4js日志管理详解

    日志对任何的应用来说都是至关重要的,下面这篇文章主要给大家介绍了关于Node.js log4js日志管理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • node.js中的path.join方法使用说明

    node.js中的path.join方法使用说明

    这篇文章主要介绍了node.js中的path.join方法使用说明,本文介绍了path.join的方法说明、语法、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • Node.js爬虫如何获取天气和每日问候详解

    Node.js爬虫如何获取天气和每日问候详解

    这篇文章主要给大家介绍了关于Node.js爬虫如何获取天气和每日问候的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Node.js爬虫具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Node实现搜索框进行模糊查询

    Node实现搜索框进行模糊查询

    这篇文章主要为大家详细介绍了Node实现搜索框进行模糊查询,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • nodeJS express路由学习req.body与req.query方法实例详解

    nodeJS express路由学习req.body与req.query方法实例详解

    这篇文章主要为大家介绍了nodeJS express路由学习req.body与req.query方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • node.js readline和line-reader逐行读取文件方法

    node.js readline和line-reader逐行读取文件方法

    Readline是Node的原生模块。它是专门为从任何可读流逐行读取内容而开发的。它可用于从命令行读取数据,line-reader模块是Node.js中逐行读取文件的开源模块。它不是本地模块,所以你需要使用npm(节点包管理器)安装它
    2022-10-10
  • NodeJS服务器实现gzip压缩的示例代码

    NodeJS服务器实现gzip压缩的示例代码

    这篇文章主要介绍了NodeJS服务器实现gzip压缩的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10

最新评论