轻松创建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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs微信开发之接入指南
Mar 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 文件上传功能实现代码
2009/06/24 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
用JavaScript调用WebService的示例
2008/04/07 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
Python 连连看连接算法
2008/11/22 Python
python正则表达式re模块详解
2014/06/25 Python
python sort、sorted高级排序技巧
2014/11/21 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
求职毕业生自荐书
2014/02/08 职场文书
公司副总经理任命书
2014/06/05 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
信息合作协议书
2014/10/09 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
检讨书格式
2019/04/25 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书