轻松创建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中SSL服务的性能
Jul 15 NodeJs
nodejs的10个性能优化技巧
Jul 15 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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验证码生成代码
2015/11/11 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
js 编写规范
2010/03/03 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
纯javascript版日历控件
2016/11/24 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
详解python中@的用法
2019/03/27 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
详解Django配置优化方法
2019/11/18 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Python类及获取对象属性方法解析
2020/06/15 Python
python 写一个文件分发小程序
2020/12/05 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
模范家庭事迹材料
2014/02/10 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
欢迎领导标语
2014/06/27 职场文书
2014司机年终工作总结
2014/12/05 职场文书
升学宴家长答谢词
2015/09/29 职场文书
教师外出学习心得体会
2016/01/18 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
关于JavaScript轮播图的实现
2021/11/20 Javascript