今天用了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>")
});