轻松创建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 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
nodejs教程之异步I/O
Nov 21 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
jQuery之网页换肤实现代码
2011/04/30 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python中的ceil()方法使用教程
2015/05/14 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
Python函数装饰器实现方法详解
2018/12/22 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
python自定义时钟类、定时任务类
2021/02/22 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
Python中qutip用法示例详解
2020/10/02 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
党课培训心得体会
2014/09/02 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
地方白酒代理协议书
2014/10/25 职场文书
委托培训协议书
2014/11/17 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python