轻松创建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服务器(7):阻塞操作的实现
Dec 18 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 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
easyui的tabs update正确用法分享
2014/03/21 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
一段实用的php验证码函数
2016/05/19 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
使用Python开发windows GUI程序入门实例
2014/10/23 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
浅析Python __name__ 是什么
2020/07/07 Python
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
物业管理求职自荐信
2013/09/25 职场文书
参观监狱心得体会
2014/01/02 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js