轻松创建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服务器(10):处理POST请求
Dec 18 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 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&&mysql)六
2006/10/09 PHP
利用PHP动态生成VRML网页
2006/10/09 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Jquery 表格合并的问题分享
2011/09/17 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python 实现简单的电话本功能
2015/08/09 Python
Python之os操作方法(详解)
2017/06/15 Python
Python KMeans聚类问题分析
2018/02/23 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
django创建简单的页面响应实例教程
2019/09/06 Python
使用python模拟高斯分布例子
2019/12/09 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
this关键字的作用
2016/01/30 面试题
工程招投标邀请书
2014/01/26 职场文书
个人自我鉴定总结
2014/03/25 职场文书
大班幼儿评语大全
2014/04/30 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
高三毕业评语
2014/12/31 职场文书
北京故宫导游词
2015/01/31 职场文书
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android