轻松创建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学习笔记之Stream模块
Jan 13 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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
索尼ICF-SW100收音机评测
2021/03/02 无线电
php对象和数组相互转换的方法
2015/05/12 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
Python3 模块、包调用&路径详解
2017/10/25 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
UDP协议功能
2013/01/06 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
物理专业本科生自荐信
2014/01/30 职场文书
保护动物倡议书
2014/04/15 职场文书
工业设计专业自荐书
2014/06/05 职场文书
环保建议书作文300字
2015/09/14 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python