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 url验证(url-valid)的使用方法
Nov 18 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 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/12/31 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
javascript event 事件解析
2011/01/31 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
angularjs实现简单的购物车功能
2017/09/21 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python获取邮件地址的方法
2015/07/10 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
python脚本实现验证码识别
2018/06/07 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python气泡提示与标签的实现
2020/04/01 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
电大物流学生的自我评价
2013/10/25 职场文书
学院领导推荐信
2013/10/30 职场文书
擅自离岗检讨书
2014/02/11 职场文书
2014春晚主持词
2014/03/25 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
家长会演讲稿
2014/04/26 职场文书
校园安全广播稿范文
2014/09/25 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang