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入门详解(多篇文章结合)
Mar 07 NodeJs
跟我学Nodejs(三)--- Node.js模块
May 25 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodeJS微信分享
Dec 20 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
nodejs微信开发之接入指南
Mar 17 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作的文本留言本的例子(三)
2006/10/09 PHP
NO3第三帝国留言簿制作过程
2006/10/09 PHP
php实现读取超大文件的方法
2014/07/28 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python中函数总结之装饰器闭包详解
2016/06/12 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
python日志模块logbook使用方法
2019/09/19 Python
Python模块的制作方法实例分析
2019/12/21 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
python db类用法说明
2020/07/07 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
幼儿园新学期寄语
2014/01/18 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书