轻松创建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 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php skymvc 一款轻量、简单的php
2011/06/28 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
PHP echo()函数讲解
2019/02/15 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
过期软件破解办法实例详解
2017/01/04 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python中的元组介绍
2019/01/28 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
html5绘制时钟动画
2014/12/15 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
前台接待员岗位职责
2014/01/02 职场文书
高校教师岗位职责
2014/03/18 职场文书
酒后驾车标语
2014/06/30 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
内科护士节演讲稿
2014/09/11 职场文书
公司开除员工通知
2015/04/22 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
python实现三次密码验证的示例
2021/04/29 Python
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
java版 联机五子棋游戏
2022/05/04 Java/Android
spring 项目实现限流方法示例
2022/07/15 Java/Android