轻松创建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服务器(4):路由
Dec 18 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
Nodejs实现WebSocket代码实例
May 19 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
php中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
php两种无限分类方法实例
2015/04/21 PHP
php多重接口的实现方法
2015/06/20 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
python设计模式大全
2016/06/27 Python
Python实现的桶排序算法示例
2017/11/29 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Python修改列表值问题解决方案
2020/03/06 Python
文秘专业大学生求职信
2013/11/10 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
自我推荐信怎么写
2015/03/24 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
javascript函数式编程基础
2021/09/15 Javascript
阿里云日志过滤器配置日志服务
2022/04/09 Servers