轻松创建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+express+html5 实现拖拽上传
Aug 08 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 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
fgetcvs在linux的问题
2012/01/15 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
Jquery性能优化详解
2014/05/15 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
2020/12/19 Vue.js
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
python 实现插入排序算法
2012/06/05 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
python  logging日志打印过程解析
2019/10/22 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
某科技软件测试面试题
2013/05/19 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
产品工艺师的岗位职责
2013/11/15 职场文书
房产分割协议书范文
2014/11/21 职场文书
给老婆道歉的话
2015/01/20 职场文书
大学生实习推荐信
2015/03/27 职场文书
六一亲子活动感想
2015/08/07 职场文书
如何在Python项目中引入日志
2021/05/31 Python