轻松创建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 npm install全局安装和本地安装的区别
Jun 05 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 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中die(),exit(),return的区别
2013/06/20 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
PHP 图片处理
2020/09/16 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
jQuery的框架介绍
2016/05/11 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
Python迭代器和生成器介绍
2015/03/06 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python3.4实现邮件发送功能
2018/05/28 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
python实现的config文件读写功能示例
2019/09/24 Python
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
保护环境倡议书500字
2014/05/19 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
感谢信的格式
2015/01/21 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Mysql基础之常见函数
2021/04/22 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Python实现智慧校园自动评教全新版
2021/06/18 Python
Element实现动态表格的示例代码
2021/08/02 Javascript
Android中的Launch Mode详情
2022/06/05 Java/Android
JS实现简单九宫格抽奖
2022/06/28 Javascript