轻松创建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+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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开发注意事项总结
2015/02/04 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
Javascript中的this绑定介绍
2011/09/22 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
详解python单例模式与metaclass
2016/01/15 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
python:动态路由的Flask程序代码
2019/11/22 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
一月红领巾广播稿
2014/02/11 职场文书
促销活动方案模板
2014/02/24 职场文书
争先创优心得体会
2014/09/12 职场文书
导游词欢迎词
2015/02/02 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
python 模块重载的五种方法
2021/04/24 Python
python3实现无权最短路径的方法
2021/05/12 Python