轻松创建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和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
Nodejs Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 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
Syphon 秘笈
2021/03/03 冲泡冲煮
全文搜索和替换
2006/10/09 PHP
php中截取字符串支持utf-8
2007/01/18 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python的迭代器和生成器
2015/07/29 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
不可错过的十本Python好书
2017/07/06 Python
flask中的wtforms使用方法
2018/07/21 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
经理秘书岗位职责
2013/11/14 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书