轻松创建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实现获取某宝商品分类
May 28 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
Nodejs实现微信分账的示例代码
Jan 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
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
微信API接口大全
2015/04/15 PHP
JS匀速运动演示示例代码
2013/11/26 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
js module大战
2019/04/19 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
Python实现单词拼写检查
2015/04/25 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
运动会方阵解说词
2014/02/12 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS