轻松创建nodejs服务器(5):事件处理程序


Posted in NodeJs onDecember 18, 2014

为了对不同请做出不同的反馈,我们引入一个事件处理器的模块。

该模块命名为 requestHandlers,我们先添加start() 和 upload()两个占位函数。

requestHandlers.js 代码如下:

function start() {

    console.log("访问/star时调用这个。");

}

 

function upload() {

    console.log("访问/upload时调用这个。");

}

 

exports.start = start;

exports.upload = upload;

在真实的应用中,请求处理程序的数量会不断增加,我们当然不想每次有一个新的URL或请求处理程序时,都要为了在路由里完成请求

到处理程序的映射而反复折腾。

除此之外,我们也不想在在路由里有一大堆if request == x then call handler y,这样会让代码看起来 很杂乱、很不专业的感觉。

这里我将使用关联数组的概念来处理这个需求,我们将一系列请求处理程序通过一个对象来传递,并且需要使用松耦合的方式将这个对象注入到route()函数中。

我们先将这个对象引入到主文件index.js中:

var server = require("./server");

var router = require("./router");

var requestHandlers = require("./requestHandlers");

 

var handle = {};

handle["/"] = requestHandlers.start;

handle["/start"] = requestHandlers.start;

handle["/upload"] = requestHandlers.upload;

 

server.start(router.route, handle);

比如我想加一个/show的映射,直接添加一句 handle["/show"] requestHandlers.show;就可以了;

哈哈,这样一来代码是不是简洁有秩序多了?!

接下来我们将handle对象传给服务器,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.writeHead(200, {"Content-Type": "text/plain"});

  response.write("Hello World");

  response.end();

 }

 http.createServer(onRequest).listen(8888);

 console.log("Server has started.");

}

exports.start = start;

对应地修改route.js文件中修改route()函数:

function route(handle, pathname) {

 console.log("About to route a request for " + pathname);

 if (typeof handle[pathname] === 'function') {

  handle[pathname]();

 } else {

  console.log("No request handler found for " + pathname);

 }

}

exports.route = route;

我们将handle对象作为参数传给服务器,再由路由接收,最后由路由来判断当前路径对应的请求处理程序存在否,存在的话就调用对应的函数。

我们可以用从关联数组中获取元素一样的方式从传递的对象中获取请求处理函数,因此就有了简洁流畅的形如handle[pathname]();的表达式,这个感觉就像在前方中提到的那样:“嗨,请帮我处理了这个路径”。

这样一来,我们就可以根据不同请求作出不同的处理了。

下一节我们将进一步改造代码,让服务器作出一些实际的反馈操作。

NodeJs 相关文章推荐
nodejs实用示例 缩址还原
Dec 28 NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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
Nodejs实现的一个静态服务器实例
Dec 06 #NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 #NodeJs
You might like
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php简单中奖算法(实例)
2017/08/15 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
python操作MongoDB基础知识
2013/11/01 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Java分治归并排序算法实例详解
2017/12/12 Python
Python中的默认参数实例分析
2018/01/29 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
python 制作网站小说下载器
2021/02/20 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
我的梦中国梦演讲稿
2014/04/23 职场文书
道德模范事迹材料
2014/12/20 职场文书
三孔导游词
2015/02/05 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书