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、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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实现Socket服务器的代码
2008/04/03 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
二级域名转向类
2006/11/09 Javascript
AJAX架构之Dojo篇
2007/04/10 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
简化Python的Django框架代码的一些示例
2015/04/20 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
python中bytes和str类型的区别
2019/10/21 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Python中无限循环需要什么条件
2020/05/27 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
大学毕业感言50字
2014/02/07 职场文书
工作表扬信
2015/01/17 职场文书
小学教师见习总结
2015/06/23 职场文书
PHP策略模式写法
2021/04/01 PHP
Python机器学习之PCA降维算法详解
2021/05/19 Python