轻松创建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 相关文章推荐
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
Nodejs学习笔记之Global Objects全局对象
Jan 13 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
js Dialog 实践分享
2012/10/22 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
javascript实现延时显示提示框效果
2017/06/01 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
财政局长自荐信范文
2013/12/22 职场文书
带薪年假请假条
2014/02/04 职场文书
国庆宣传标语
2014/06/30 职场文书
考研英语复习计划
2015/01/19 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
开学典礼观后感
2015/06/15 职场文书
欠条格式范本
2015/07/03 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
TS 类型收窄教程示例详解
2022/09/23 Javascript