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导出excel的方法
Jun 30 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodejs基础知识
Feb 03 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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 无限极分类
2008/03/27 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
php单一接口的实现方法
2015/06/20 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
用python读写excel的方法
2014/11/18 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
python中如何进行连乘计算
2020/05/28 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
户籍证明的格式
2014/01/13 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2015年公司工作总结
2015/04/25 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python