express 框架的简易实现

2020-06-06  本文已影响0人  泰然自若_750f

简易源码

 
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
上一篇 下一篇

猜你喜欢

热点阅读