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 31 NodeJs
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
详解nodejs内置模块
May 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
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
使用Vue生成动态表单
2019/11/26 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
学习python可以干什么
2019/02/26 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
python设置随机种子实例讲解
2019/09/12 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python属于软件吗
2020/06/18 Python
中国跨境电商:Tomtop
2017/03/16 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
介绍一下Java中的Class类
2015/04/10 面试题
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
材料工程专业毕业生求职信
2014/03/04 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
ORACLE查看当前账号的相关信息
2021/06/18 Oracle