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开发微信公众号后台服务实例
Sep 03 NodeJs
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 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实现批量查询清除一句话后门的代码
2008/01/20 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
js中的面向对象入门
2017/03/06 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python 实现多线程下载视频的代码
2019/11/15 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
求职自荐信格式
2013/12/04 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书