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服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
nodejs中的异步编程知识点详解
Jan 17 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 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 Mysql编程之高级技巧
2008/08/27 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
如何实现JS函数的重载
2006/09/22 Javascript
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
解决python写的windows服务不能启动的问题
2014/04/15 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Sanic框架配置操作分析
2018/07/17 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
红领巾广播站广播稿
2014/02/01 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
职位证明模板
2015/06/23 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书