轻松创建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开发微博实例
Mar 25 NodeJs
NodeJS使用formidable实现文件上传
Oct 27 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 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中如何实现Hook机制
2017/11/14 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
python爬虫基本知识
2018/03/05 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
农民致富事迹材料
2014/01/23 职场文书
信息技术课后反思
2014/04/27 职场文书
伦敦奥运会口号
2014/06/13 职场文书
施工员岗位职责
2015/02/10 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL