Nodejs 路由模块封装封装仿照 express 的路由
Posted 柳帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs 路由模块封装封装仿照 express 的路由相关的知识,希望对你有一定的参考价值。
1、 模块化的方式封装
`model/model.js`
// 导入模块 var ejs=require(‘ejs‘); var fs=require(‘fs‘); var app ={ // login login:function (req, res) { console.log(‘login‘); ejs.renderFile(‘views/form.ejs‘,{},function (err,data) { res.end(data); }) }, // dologin dologin:function (req, res) { console.log(‘333dologin‘); var postStr = ‘‘; req.on(‘data‘,function (chunk) { postStr+= chunk; }); req.on(‘end‘,function (err,chunk) { console.log(postStr); fs.appendFile(‘login.txt‘,postStr+‘ ‘,function (err) { if (err){ console.log(err); return false; } console.log(‘写入成功‘) }); res.end("<script>alert(‘登录成功‘);history.back();</script>") }); }, // register register:function (req, res) { console.log(‘register‘); res.end(‘register‘) }, home:function (req, res) { console.log(‘home‘); res.end(‘home‘) } }; // 暴露 module.exports=app; /* 调用方式 app.login(req,res) app[‘login‘](req,res) */
` 01 services.js`
//引入http模块 var http=require(‘http‘); var url =require(‘url‘); // 导入自己封装的路由 var model = require(‘./model/model‘); //路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。 http.createServer(function(req,res){ // http://localhost:8001/login res.writeHead(200,{"Content-Type":"text/html;charset=‘utf-8‘"}); var pathname = url.parse(req.url).pathname.replace(‘/‘,‘‘) console.log(pathname); // 调用路由,处理逻辑 if (pathname!==‘favicon.ico‘){ try{ model[pathname](req,res); }catch (err) { model[‘home‘](req,res) } } }).listen(8001);
2、 封装仿照 express 的路由
1、nodejs 万事万物皆为对象
构建一个app对象,可以再绑定属性和方法
var app=function(){ console.log(‘app‘); } app.get=function(){ console.log(‘app.get‘); } app.post=function(){ console.log(‘app.post‘); } app.post() /*app.post*/ // app() /*app*/
2 仿照 express,封装路由
```
代码执行顺序: 从上到下
```
var G ={}; var app =function (req, res) { if (G[‘login‘]){ G[‘login‘](req,res);/*执行注册方法*/ } }; // 定义一个get 方法 app.get = function (string, callback) { G[string]=callback // G[string] = 函数 }; // 执行get方法 login 页面的处理逻辑 app.get(‘login‘,function (req, res) { console.log(‘login‘+req) });
// 程序开始执行 setTimeout(function () { app(‘req‘,‘res‘) },1000);
再次升级 `03 router_express_2.js`
var http=require(‘http‘); var url= require(‘url‘); var G ={}; var app =function (req, res) { var pathname = url.parse(req.url).pathname.replace(‘/‘,‘‘); console.log(pathname); if (G[pathname]){ G[pathname](req,res); } // if (G[‘login‘]){ // G[‘login‘](req,res);/*执行注册方法*/ // } }; // 定义一个get 方法 app.get = function (string, callback) { G[string]=callback // G[string] = 函数 }; // 只需要请求,就会触发app这个方法 http.createServer(app).listen(8001); // 注册login 路由 app.get(‘login‘,function (req, res) { console.log(‘login‘); res.end(‘login‘); }); // 注册 register 路由 app.get(‘register‘,function (req, res) { console.log(‘register‘); res.end(‘register‘); });
最后的封装
`model/express_router.js`
var url = require(‘url‘); // 封装 res 的send 方法 function changeRes(res) { res.send = function (data){ res.writeHead(‘200‘,{‘Content-Type‘:‘text/html;charset="UTF-8"‘}); res.end(data) } } var Server = function () { var G = this; /* 全局变量 */ // 处理get和post请求 this._get={}; this._post={}; var app=function (req, res) { // res 封装send方法 changeRes(res); var pathname = url.parse(req.url).pathname.replace(‘/‘,‘‘); var method = req.method.toLowerCase(); console.log(method,pathname); console.log(G[‘_‘+method]); if (G[‘_‘+method][pathname]){ if (method ===‘post‘){ /* 处理 post 请求 */ var postStr =‘‘; req.on(‘data‘,function (chunk) { postStr+=chunk }); req.on(‘end‘,function (err, chunk) { req.body = postStr; G[‘_‘+method][pathname](req,res); /*执行方法*/ // res.end(pathname) }) }else{ /* 处理非 post 请求 */ G[‘_‘+method][pathname](req,res) // res.end(pathname) } }else{ res.end(‘no router!‘) } }; // 注册方式 app.get=function (string, callback) { console.log( G._get[string],string); G._get[string]=callback }; app.post=function (string, callback) { G._post[string]=callback }; return app }; module.exports = Server();
执行程序 `router_express_module.js`
var http = require(‘http‘); var ejs = require(‘ejs‘); var app = require(‘./model/express_router.js‘); console.log(app); http.createServer(app).listen(8001); //登录页面 app.get(‘login‘,function(req,res){ ejs.renderFile(‘views/form.ejs‘,{},function(err,data){ res.send(data); }) }); app.post(‘dologin‘,function (req, res) { res.send("<script>alert(‘successful !‘);history.back();</script>") }); app.get(‘news‘,function (req, res) { res.send("国际大新闻") });
以上是关于Nodejs 路由模块封装封装仿照 express 的路由的主要内容,如果未能解决你的问题,请参考以下文章
对比原生Node封装的Express路由 和 express框架路由