轻松创建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的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
nodejs中使用monk访问mongodb
Jul 06 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 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缓冲 output_buffering的使用详解
2013/06/13 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
Python translator使用实例
2008/09/06 Python
Python采用raw_input读取输入值的方法
2014/08/18 Python
python计算一个序列的平均值的方法
2015/07/11 Python
Python实现的栈(Stack)
2018/01/26 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
Python实现自动打开电脑应用的示例代码
2020/04/17 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
自我鉴定范文
2013/11/10 职场文书
法学毕业生自荐信
2013/11/13 职场文书
银行实习生的自我评价
2014/01/13 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js