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 npm package.json中文文档
Sep 04 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
Nodejs初级阶段之express
Nov 23 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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 print EOF实现方法
2009/05/21 PHP
php删除指定目录的方法
2015/04/03 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
python在不同层级目录import模块的方法
2016/01/31 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
python实现猜单词游戏
2020/05/22 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
详解px单位html5响应式方案
2018/03/08 HTML / CSS
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
若干个Java基础面试题
2015/05/19 面试题
高级销售员求职信
2013/10/25 职场文书
拉拉队口号
2014/06/16 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
PHP中strval()函数实例用法
2021/06/07 PHP