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爬虫抓取数据乱码问题总结
Jul 03 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs获取微信小程序带参数二维码实现代码
Apr 12 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
php递归函数怎么用才有效
2018/02/24 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
PDO实现学生管理系统
2020/03/21 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
jquery遍历input取得input的name
2009/04/27 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
python实现复制大量文件功能
2019/08/31 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Python持续监听文件变化代码实例
2020/07/22 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
幼儿园数学教学反思
2014/02/02 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
蓝颜请假条
2014/04/11 职场文书
大学生团员个人总结
2015/02/14 职场文书
js 数组 fill() 填充方法
2021/11/02 Javascript
Ajax异步刷新功能及简单案例
2021/11/20 Javascript