玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快
2016-10-13 09:34
811 查看
前言:
使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合;
1、原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快
2、不包含任何第三方库/框架,可以灵活的搭配其他库/框架进行web开发
github项目地址:https://github.com/eguid/eguidRouter
nodejs单机多进程(集群)实现:http://blog.csdn.net/eguid_1/article/details/52849472
res.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
res.write("{'retSt': 200,'retMsg': '请求成功','retData':' 当前时间:" + new Date().toLocaleString() + "'}");
res.end();
};
例如:
eguid.add("/getNowTime", getNowTime);//getNowTime请求会自动调用上面定义的getNowTime方法
如果不喜欢上面这种写法的话,当然也可以这样:
eguid.add("/getNowTime",function(req, res, pathName){...});
eguid.index('/', '/index.html');//设置首页
eguid.index('/helloWorld', '/index.html');//设置原始页面别名打开,/helloWolrd请求打开的是/index.html静态页面
该方法允许更改静态资源访问方式,该方法会覆盖默认的静态路由处理方式,方便从缓存中读取静态资源或者进行模板操作
新版支持eguid.start(8081,8);//多进程共享端口号8081,开启8个进程,其中包含1个主进程,7个子进程
开启服务器后会自动进行静态资源路由和根据添加的路由进行解析
使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合;
1、原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快
2、不包含任何第三方库/框架,可以灵活的搭配其他库/框架进行web开发
github项目地址:https://github.com/eguid/eguidRouter
1、API介绍及使用说明
注:新版本新增一个修改/自定义静态路由处理方法和开启单机集群功能集群nodejs单机多进程(集群)实现:http://blog.csdn.net/eguid_1/article/details/52849472
1.1、在入口中引入eguidRoute路由模块
var eguid = require("./eguidRouter");1.2、定义一个REST请求处理方法
var getNowTime = function(req, res, pathName) {res.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
res.write("{'retSt': 200,'retMsg': '请求成功','retData':' 当前时间:" + new Date().toLocaleString() + "'}");
res.end();
};
1.3、添加REST请求处理方法到动态路由
add("请求名","请求对应的处理方法")例如:
eguid.add("/getNowTime", getNowTime);//getNowTime请求会自动调用上面定义的getNowTime方法
如果不喜欢上面这种写法的话,当然也可以这样:
eguid.add("/getNowTime",function(req, res, pathName){...});
1.4、设置静态请求的别名
index("别名","原始静态资源路径")设置的是静态资源请求的别名eguid.index('/', '/index.html');//设置首页
eguid.index('/helloWorld', '/index.html');//设置原始页面别名打开,/helloWolrd请求打开的是/index.html静态页面
1.5、创建新的静态路由处理
modStatic(req,res,pathName)该方法允许更改静态资源访问方式,该方法会覆盖默认的静态路由处理方式,方便从缓存中读取静态资源或者进行模板操作
1.6、开启服务器,监听端口
eguid.start(8081);新版支持eguid.start(8081,8);//多进程共享端口号8081,开启8个进程,其中包含1个主进程,7个子进程
开启服务器后会自动进行静态资源路由和根据添加的路由进行解析
2、eguid路由0.2.1代码一览,如丝般顺滑的原生API体验 :-D
新版本请转到github项目地址查看,github项目地址:https://github.com/eguid/eguidRouterconst http = require('http'); const url = require('url'); const path = require('path'); const fs = require('fs'); const cluster = require('cluster'); //路由表 var routeArr = {}; //进程列表 var workers = {}; //进程数量 var clusterNum; //解析请求地址 var getPathName = function(reqUrl) { var urlParse = getUrlParse(reqUrl); return urlParse.pathname; }; //获取url解析 var getUrlParse = function(reqUrl) { return url.parse(reqUrl); }; //是否是一个请求 var isFunc = function(pathName) { return typeof routeArr[pathName] === 'function'; }; /**静态资源处理 param(req:请求,res:响应,pathName:路径) */ var resStatic = function(req, res, pathName) { fs.readFile(pathName.substr(1), function(err, data) { err ? endErrorReq(res, 501) : endStaticReq(res, pathName, data); res.end(); }); }; //响应静态资源 var endStaticReq = function(res, pathName, data) { var suffix = path.extname(pathName); res.writeHead(200, { 'Content-Type': suffix === ".css" ? 'text/css' : 'text/html;' + 'charset=utf-8' }); res.write(data); }; //结束错误请求 var endErrorReq = function(res, err) { res.writeHead(err); res.end(); }; /** 路由分发处理器 */ var routeHandler = function(req, res) { var pathName = getPathName(req.url); isFunc(pathName) ? routeArr[pathName](req, res, pathName) : resStatic(req, res, pathName); console.log("处理了一个请求:" + pathName); }; /** 添加动态路由解析 * param{ * reqUrl:请求地址, * service:function(request:请求,response:响应,pathName:请求名)} */ var addDynamicRoute = function(reqUrl, service) { console.log("添加的服务名:" + reqUrl); routeArr[reqUrl] = service; }; /** 开启服务器并监听端口 param{port:端口号}*/ var startServer = function(port, num) { clusterNum = num; if (num) { startClusterSever(port, num); } else { //创建服务器 http.createServer(function(req, res) { routeHandler(req, res); }).listen(port); //注意这里的端口改成了变量 //开启后在控制台显示该服务正在运行 console.log('Server running at http://127.0.0.1:' + port); } }; /** 设置静态页面请求别名 param(newUrl:新的请求路径, oldUrl:原始路径) */ var setIndex = function(newUrl, oldUrl) { addDynamicRoute(newUrl, function(req, res) { resStatic(req, res, oldUrl); }); }; /**自定义静态页面处理方式 staticHandlerService=function(req,res,pathName)*/ var setresStaticFunc = function(staticHandlerService) { resStatic = staticHandlerService; }; //开启集群服务 var startClusterSever = function(port, numCPUs) { if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { const work = cluster.fork(); console.log(work.process.pid); workers[i] = work; } cluster.on('exit', (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); }); } else { console.log(cluster.worker.id); http.createServer((req, res) => { console.log("子进程:" + cluster.worker.id + "正在处理请求..."); routeHandler(req, res); }).listen(port); } } exports.route = routeHandler; exports.add = addDynamicRoute; exports.start = startServer; exports.index = setIndex; exports.modStatic = setresStaticFunc; /** * eguidRouter快速灵活的路由 * 功能实现: * 1、自动静态路由解析 * 2、支持手动设置静态路由别名 * 3、支持创建新的静态路由实现(方便加载模板) * 4、动态路由解析 * 5、自动错误响应 * 6、使用原生API,无第三方框架 * 7、支持cluster单机集群(机器性能压榨机) */
相关文章推荐
- 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快
- 玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)
- 玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)
- (视频)玩转Membership视频之二:使用系列“登录控件”实现高效开发
- 声卡虚拟示波器简单功能-使用matlab DAQ工具箱中API实现
- 一步一步学Silverlight 2系列(5):实现简单的拖放功能
- 快速实现简单高效并可以灵活配置的URL重写方案(附源代码)
- VB 使用API实现INET功能
- C#使用命令行方式实现Ping简单功能 http://www.cnblogs.com/kevinton/archive/2007/06/28/798581.html
- 使用bitmapData简单实现涂鸦中的橡皮功能(as3)
- Castle AOP 系列(三):实现一个简单的调用指令路由
- 快速实现简单高效并可以灵活配置的URL重写方案(附源代码)
- 使用Hashtable实现简单缓存功能
- 一步一步学Silverlight 2系列(5):实现简单的拖放功能
- 使用bitmapData简单实现涂鸦中的橡皮功能[Flex]
- BBS 设计思路系列 ---- 论坛制度功能到底是应该是简单还是复杂??
- [ASP]RegExp对象提供简单的正则表达式支持功能使用说明
- C#使用命令行方式实现Ping简单功能
- BBS 设计思路系列 ---- 论坛制度功能到底是应该是简单还是复杂??
- JDK核心API:使用动态代理实现AOP功能