简易源码
let http=require('http');
let url=require('url');
function createAppAplication(){
let appRoutes=[];//路由
const methods=http.METHODS; //所有网络请求方法
let app=(req,res)=>{
let index=0;
function next(error){
if(index===appRoutes.length)
{
res.end(`can not ${methodName} ${pathname}`);
return;
}
let methodName=req.method.toLowerCase();
let {pathname}=url.parse(req.url,true);
let {method,path,handler}=appRoutes[index++];
//如果中间件右报错信息
if(error)
{
console.log('处理报错');
console.log(handler);
if(handler.length===4)
{
handler(error,res,req,next)
}
else{
next(error);
}
return;
}
//如果是中间件
if(method==='middle')
{
//
if(path==='/' || path===pathname || pathname.startsWith(path))
{
handler(req,res,next);
}
else{
next();
}
}
else{
if((method===methodName|| method==='all') && (path===pathname || path==='*'))
{
handler(req,res);
return;
}
else{
//没有匹配到接着匹配
next();
}
}
}
next();
// //获取当前请求方法
// let methodName=req.method.toLowerCase();
// //获取请求路径 依赖 url 模块
// let {pathname}=url.parse(req.url,true);
// for(let {method,path,handler} of appRoutes)
// {
// if(method===methodName && path===pathname)
// {
// handler(req,res);
// return;
// }
// }
// //都没有匹配到
// res.end(`can not ${methodName} ${pathname}`);
}
/**
* 收集中间件
*/
app.use=function(path,handler){
if(typeof path ==='function')
{
handler=path;
path='/';
}
appRoutes.push({
method:'middle',
path,
handler,
})
}
//内置中间件 获得请求信息
app.use(function(req,res,next){
let {pathname,query}=url.parse(req.url,true);
let hostname=req.headers['host'].split(':')[0];
req.pathname=pathname;
req.query=query;
req.hostname=hostname;
next();
})
//配置 app.get 等
methods.forEach((method)=>{
//获得都是大写的 转为小写
method=method.toLowerCase();
app[method]=(path,handler)=>{
let item={
method,
path,
handler
}
//console.log(item);
appRoutes.push(item);
}
})
//所有请求都配匹配到
app.all=function(path,handler){
appRoutes.push({
method:'all',
path,
handler,
})
}
//端口监听
app.listen=function(){
let server=http.createServer(app);
server.listen(...arguments);
}
return app;
}
module.exports=createAppAplication;
测试
const express=require('./express');
let app=express();
app.use(function(req,res,next){
//设置请求头
res.setHeader('Content-Type','text/html;charset=utf-8');
next();
})
app.use('/name',function(req,res,next){
//设置请求头
console.log('进入name的 中间件');
// next("报错中间件");
next();
})
app.get('/name',(req,res)=>{
let {pathname,hostname,query}=req;
let message={
pathname,
hostname,
query
}
res.end(`请求信息:${JSON.stringify(message)}: 返回结果:于学文`);
})
app.get('/age',(req,res)=>{
res.end('27');
})
app.use((error,req,res,next)=>{
next(error);
})
app.use((error,req,res,next)=>{
console.log(error);
})
app.listen(3000,()=>{
console.log('监听30010端口');
})
image.png
网友评论