轻松创建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中自定义事件实例
Jun 20 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 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在线生成ico文件的代码
2007/10/09 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
自制PHP框架之设计模式
2017/05/07 PHP
JavaScript中的其他对象
2008/01/16 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
Vue指令指令大全
2019/02/09 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
Python中的自定义函数学习笔记
2014/09/23 Python
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
python导入时小括号大作用
2017/01/10 Python
python列表使用实现名字管理系统
2019/01/30 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
python 实现生成均匀分布的点
2019/12/05 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
医生进修自我鉴定
2014/01/19 职场文书
开发房地产协议书
2014/09/14 职场文书
三方协议书
2015/01/27 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis