nodejs中实现路由功能


Posted in NodeJs onDecember 29, 2014

初学Node,发现了与自己之前的观点完全不同的场面——你眼中的JavaScript,是干什么用的呢?特效?or 只是与客户端的交互?可以说,JavaScript最早是运行在浏览器中的,然而你要这样想,浏览器只是你提供了一个上下文(context),它定义了 使用JavaScript可以做什么,这里可以想成类似的一个企业,企业定义了你可以在这里做什么,但是并没有说太多关于JavaScript语言本身可 以做什么。事实上,作为一门完整的语言,JavaScript可以使用在不同的上下文中,体现出不同的能力。这里所讲到的Nodejs其实说白了就是提供 的一个上下文,一个运行环境,它允许在后端(脱离浏览器环境)来运行JavaScript代码。

路由选择的核心是路由,顾名思义,路由指的就是我们要针对不同的URL有不同的处理方式,例如处理/start的业务逻辑和处理/upload模块 的业务;逻辑就是不一致的。在现实的实现下,路由过程会在路由模块中“结束”,并且路由模块并不是真正者针对请求“采取行动”的模块,否则当我们的应用程 序变得更为复杂的时候就将无法得到很好的扩展。

这里我们首先创建一个叫做requestHandlers的模块,对于每一个请求处理程序都添加一个占位函数:

function start(){   

    console.log("Request handler 'start' was called.");   

       

    function sleep(milliSeconds){   

        var startTime=new Date().getTime();   

        while(new Date().getTime()<startTime+milliSeconds);   

    }   

    sleep(10000);   

    return "Hello Start";   

}   

function upload(){   

    console.log("Request handler 'upload' was called.");   

    return "Hello Upload";   

}   

  

exports.start=start;   

exports.upload=upload;

这样我们就可以将请求处理程序和路由模块连接起来,让路由“有路可循”。之后我们确定将一系列请求处理程序通过一个对象来传递,并且需要使用松耦合的方式将这个对象注入到router()函数中,主文件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);

如上所示,将不同的URL映射到相同的请求处理程序上是容易的:只要在对象中添加一个键为“/”的属性,对应 requestHandlers.start即可。这样我们就可以简洁地配置/start和/的请求都交给start这一处理程序来处理。在完成看对象的 定义后,我们将它作为额外的参数传递给服务器,见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"});   

        var content=route(handle,pathname);   

        response.write(content);   

        response.end();   

    }   

    http.createServer(onRequest).listen(8888);   

    console.log("Server has started.");   

}    

exports.start=start;

这样就在start()函数中添加了handle参数,并且把handle对象作为第一个参数传递给了route()回调函数,下面定义route.js:

function route(handle,pathname){   

    console.log("About to route a request for "+ pathname);   

    if(typeof handle[pathname]==='function‘){   

        return handle[pathname]();   

    }else{   

        console.log("No request handler found for "+pathname);   

        return "404 Not Found";   

    }   

}   

exports.route=route;

通过以上代码,我们首先检查给定的路径对应的请求处理程序是否存在,如果存在则直接调用相应的函数。我们可以用从关联数组中获取元素一样的方式从 传递的对象中获取请求处理函数,即handle[pathname]();这样的表达式,给人一种感觉就像是在说“嗨,请你来帮我处理这个路径。”程序运 行效果如下图:

 

nodejs中实现路由功能

NodeJs 相关文章推荐
NodeJS框架Express的模板视图机制分析
Jul 19 NodeJs
NodeJS url验证(url-valid)的使用方法
Nov 18 NodeJs
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 #NodeJs
NodeJS制作爬虫全过程
Dec 22 #NodeJs
nodejs中操作mysql数据库示例
Dec 20 #NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 #NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 #NodeJs
轻松创建nodejs服务器(7):阻塞操作的实现
Dec 18 #NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 #NodeJs
You might like
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
discuz目录文件资料汇总
2014/12/30 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
Python使用三种方法实现PCA算法
2017/12/12 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
企业文化演讲稿
2014/05/20 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
实习指导老师意见
2015/06/04 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
2016党员入党决心书
2015/09/22 职场文书