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 相关文章推荐
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 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通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
CSS常用网站布局实例
2008/04/03 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
2016/11/18 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
python连接池实现示例程序
2013/11/26 Python
自己使用总结Python程序代码片段
2015/06/02 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
详解python深浅拷贝区别
2019/06/24 Python
python小程序实现刷票功能详解
2019/07/17 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
护理自我鉴定范文
2013/10/06 职场文书
电气自动化自荐信
2013/10/10 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
道歉信范文
2015/05/12 职场文书
主题班会开场白
2015/06/01 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
python_tkinter弹出对话框创建
2022/03/20 Python
java中如何截取字符串最后一位
2022/07/07 Java/Android
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技