轻松创建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导出excel的方法
Jun 30 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 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的一些小问题
2010/07/03 PHP
php编写一个简单的路由类
2011/04/13 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
PHP fclose函数用法总结
2019/02/15 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
js array数组对象操作方法汇总
2019/03/18 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python生成指定长度的随机数密码
2014/01/23 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
Python 防止死锁的方法
2020/07/29 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
创先争优活动承诺书
2014/08/30 职场文书
违章停车检讨书
2014/10/21 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS