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


Posted in NodeJs onDecember 18, 2014

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

NodeJs 相关文章推荐
nodejs中使用monk访问mongodb
Jul 06 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
深入理解Nodejs Global 模块
Jun 03 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 #NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 #NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 #NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 #NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 #NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 #NodeJs
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 #NodeJs
You might like
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
php自动载入类用法实例分析
2016/06/24 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
基于anaconda下强大的conda命令介绍
2018/06/11 Python
详解【python】str与json类型转换
2019/04/29 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
python 连续不等式语法糖实例
2020/04/15 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
介绍一下如何优化MySql
2016/12/20 面试题
秋季运动会稿件
2014/01/30 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
食品安全宣传标语
2014/06/07 职场文书
个人授权委托书格式
2014/08/30 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
匿名信格式范文
2015/05/27 职场文书
安全教育主题班会教案
2015/08/12 职场文书
小学新课改心得体会
2016/01/22 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL