轻松创建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教程之入门
Nov 21 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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/02/03 PHP
PHP的博客ping服务代码
2012/02/04 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
jquery中动态效果小结
2010/12/16 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
Django日志模块logging的配置详解
2017/02/14 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
师范生自荐信
2013/10/27 职场文书
毕业生自荐书
2013/12/18 职场文书
运动会稿件50字
2014/02/17 职场文书
党员实事承诺书
2014/03/26 职场文书
会员活动策划方案
2014/08/19 职场文书
目标责任书格式范文
2015/05/11 职场文书