自己封装一个类express路由框架

今天用了Node封装一个简单的类似express框架的路由

首先先看看 没封装 之前的server路由代码

const http = require('http');

const url = require('url');
const ejs = require('ejs');

var server = http.createServer((req,res)=>{

    pathName = url.proutearse(req.url).pathname;  //获取请求的路径
    if(pathName=='/favicon.ico'){
       	  res.end();
       	  return ;
    }
    if(pathName='/login'){     //请求login页
        ejs.renderFile('tmp/login.html',{ msg:'this is login page'},(err,data)=>{
           if(err){
               console.log(err);  
           }
           res.write(data);
           res.end();
        })
    }else if(pathName='/register'){   //请求register页
        ejs.renderFile('tmp/register.html',{ msg:'this is register page'},(err,data)=>{
           if(err){
               console.log(err);  
           }
           res.write(data);
           res.end();
        })
    }else{
        res.end('404');
    }
    
    
});

server.listen('8888');

可以看到代码非常杂乱,全部代码写在createServer的回调里面。

 

我们把http.createServer()里面的代码抽离出来,另外写一个模块

express.route.js 自定义模块 就把app回调函数

//这里是express.route.js 自定义模块 
const url = require('url');

function changeRes(res){    //自己封装一个res.send方法
 
        res.send=function(data){

        res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});

        res.end(data);
    }
}

const Server = ()=>{    //定义一个函数返回一个app

	let G = this;   //定义全局对象G
	G._get = {};    //G里面定义一个对象 存放所有注册的get请求路由
	G._post ={};    //G里面定义一个对象 存放所有注册的post请求路由

	let app = (req,res)=>{

       //封装方法改变res  绑定res.send()
       changeRes(res);
       
       let pathName = url.parse(req.url).pathname;
       if(pathName=='/favicon.ico'){
       	  res.end();
       	  return ;
       }
       if(!pathName.endsWith('/')){
            pathName=pathName+'/';
       }
       let method = req.method.toLowerCase();
       console.log(G[`_${method}`],method,pathName);
       if(G[`_${method}`][pathName]){   //判断这个页面是否已经存在
            if(method =='get'){

                G[`_${method}`][pathName](req,res);  //执行定义的get请求的回调

            }else{
                let postString = '';
                req.on('data',(chunk)=>{
                	postString += chunk;
                });

                req.on('end',(err,chunk)=>{   //标志着接收完了post数据
                    req.postString = postString;   
                    G[`_${method}`][pathName](req,res);   //执行定义的post请求的回调
                })
            }
          

       }else{
       	   res.end('this router is not defind');  //这个请求不存在
       }
       

	}
    app.get=(pathName,callback)=>{    //get请求 注册函数


        if(!pathName.endsWith('/')){      pathName=pathName+'/';   }  //格式化 '/login/' 这样格式
        if(!pathName.startsWith('/')){   pathName='/'+pathName;  }   //

    	G._get[pathName] = callback;   //往_get{}里面添加方法
    } 
    app.post=(pathName,callback)=>{    //post请求 注册函数

    	if(!pathName.endsWith('/')){      pathName=pathName+'/';   }  //格式化 '/login/' 这样格式
        if(!pathName.startsWith('/')){    pathName='/'+pathName;  }   //

    	G._post[pathName] = callback;   //往_post{}里面添加方法
    } 

	return app;
}


module.exports = Server();   //把 app回调函数 export出去

接下来我们的server入口文件 就会得到简化

const http = require('http');
const ejs = require('ejs');
const app = require('./module/express.route.js');  //引入app

const server = http.createServer(app).listen('8888');  //传入app

console.log(app);

app.get('/login',(req,res)=>{     //通过给app.get()注册路由函数
   ejs.renderFile('./views/login.html',{},(err,data)=>{
      res.send(data);
   })
});

app.get('/register',(req,res)=>{
   ejs.renderFile('./views/register.html',{},(err,data)=>{
      res.send(data);
   })
});

app.post('/dologin',(req,res)=>{    //通过给app.post()注册路由函数
   res.end("<script>alert('登录成功');history.back();</script>")
});

这下就能像express一样封装了一个路由模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值