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

2023-11-19

今天用了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一样封装了一个路由模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己封装一个类express路由框架 的相关文章

随机推荐

  • 制作一辆“自动驾驶”平衡自行车需要用到哪些知识

    目录 先看下小车效果 小车电路设计 相关软件工具 keil C语言设计编码调试工具 主要 mcuisp 代码烧录工具 一般使用一种烧录工具就可以 STM32 STlink stlink烧录工具 STM32 Cube pro 烧录工具 ope
  • C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

    本文是转载的 正版是https blog twofei com 496 欢迎去看正版 C 中的虚函数 表 实现机制以及用C语言对其进行的模拟实现 前言 大家都应该知道C 的精髓是虚函数吧 虚函数带来的好处就是 可以定义一个基类的指针 其指向
  • OceanBase使用范例

    http www mysqlops com 2011 08 31 oceanbase use html OceanBase的使用类似于关系型数据库 需要预先创建schema 关于schema的格式 请参见schema说明 假如我们有以下sc
  • c#Socket 异步通讯(客户端与服务端)

    c Socket 异步通讯 多个客户端与服务端 最近公司有个项目 涉及到的通讯对象有点多 就拿其中一个库的通讯来说就用到了3个PLC 这里就涉及了一个服务器与多个客户端之间的通讯了 同时上位机既需要做客户端 也需要做服务端 因为跟PLC之间
  • HTTP响应详解, HTTP请求构造及HTTPS详解

    HTTP响应详解 认识 状态码 status code 状态码表示访问一个页面的结果 是访问成功 还是失败 还是其他的一些情况 以下为常见的状态码 200 OK 这 是一个最常见的状态码 表示访问成功 抓包抓到的大部分结果都是 200 例如
  • numpy load npz文件

    一 问题 numpy version 1 23 0 优化项目的是时候发现索引一个dict的时候很慢 因此进行分析 速度很慢的问题代码如下 arr dict np load test npz npz 100MB for i in range
  • 神州网信远程、关闭屏幕时间、关闭神州网信密码

    一 远程查看电脑 按 windows r 输入gpedit msc 运行组策略 gpedit msc 进行下面的操作 1 计算机配置 管理模板 Windows组件 远程桌面服务 远程桌面会话主机 连接 允许用户通过使用远程桌面服务进行远程连
  • Qt creator4.8.0 以上使用SqLite数据库进行数据操作

    文章目录 前言 一 在 pro工程文件中添加sql模块 二 使用步骤 1 添加头文件 2 链接并打开数据库 3 创建用户信息表management info 4 插入数据操作 5 修改数据库操作 6 查询数据库 总结 前言 Qt creat
  • 基于MATLAB的filter的使用,低通、带通和高通滤波器设计

    1 目的 学习MATLAB的filter函数的使用 通过设计低通 带通和高通滤波器对其进行仿真 2 用到的主要函数和工具 MATLAB FDATOOL filter fft 3 设计 信号的产生 Parameter Interface Fr
  • java高级开发面试题总结

    面试题总结 JAVA高级工程师 近期考虑换工作的问题 于是投简历面试 面试5家公司的高级Java工程师 有4家给了我offer 想着总结一下面试经验 方便最近正在寻求机会的你们 一 无笔试题 不知道是不是职位原因还是没遇到 面试时 都不需要
  • 阿里云轻量应用服务器使用指南适用于所有人

    最近一直在捣鼓阿里云服务器 想着把自己写好的一些项目部署到服务器上供其他人访问 一路上踩了不少坑 也查了不少资料 最后解决了 写个博客记录下来 也为其他想要建站的同学提供一个指引 购买轻量应用服务器 传送门 阿里云 如果是在校学生 可以直接
  • SpringCloud之Hystrix

    1 服务熔断与降级 在微服务架构中多层服务之间会相互调用 如果其中有一层服务故障了 可能会导致一层服务或者多层服务 故障 从而导致整个系统故障 这种现象被称为服务雪崩效应 SpringCloud 中的 Hystrix 组件就可以解决此类问题
  • 有时间再看decode详解

    Oracle 中 decode 函数用法 含义解释 decode 条件 值1 返回值1 值2 返回值2 值n 返回值n 缺省值 该函数的含义如下 IF 条件 值1 THEN RETURN 翻译值1 ELSIF 条件 值2 THEN RETU
  • 冲刺春招-精选笔面试 66 题大通关 day6

    day6题目 33 搜索旋转排序数组 54 螺旋矩阵 bytedance 006 夏季特惠 学习计划链接 冲刺春招 精选笔面试 66 题大通关 今日知识点 二分 模拟 01背包 难度为中等 中等 字节 简单 33 搜索旋转排序数组 整数数组
  • ARouter(二)源码解析

    前言 这一篇我们来具体看一下ARouter的实现原理 如果你之前没有接触过ARouter 可以先阅读上一篇 Android 从零开始打造自己的深度链接库 一 ARouter简介 废话不多 我们赶紧分析源码 正文 首先我们从github下载最
  • 中文信息处理实验8——基于逻辑斯蒂回归模型的文本分类

    目录 实验目的 实验要求 实验内容及原理 参考代码 实验结果 实验目的 加深对汉语文本信息处理基础理论及方法的认识和了解 锻炼和提高分析问题 解决问题的能力 通过对具体项目的任务分析 数据准备 算法设计和编码实现以及测试评价几个环节的练习
  • win10系统C盘出现感叹号及加密图标解除

    近期遇到Win10系统C盘图标加密情况 经过搜索查找最终解决 并对操作进行简单记录 1 以管理员身份打开命令行窗口 2 输入 manage bde off c 3 相关指令 加密指令 manage bde on c 查看状态指令 manag
  • 使用定时框架Quartz.net时,发布到服务器后无法正常执行定时任务

    问题描述 使用Quartz net每天定时执行某个任务时 未能正常执行 每次在本地测试时 设置了短的时间间隔 都能正常执行任务 但是挂到服务器后 设置定时执行时间为几个小时 却不能正常执行我们要执行的操作 原 因 IIS的程序池有一个闲置超
  • _Linux网络数据包的揭秘以及常见的调优方式总结

    作为业务 SRE 我们所运维的业务 常常以 Linux TCP UDP daemon 的形式对外提供服务 SRE 需要对服务器数据包的接收和发送路径有全面的了解 以方便在服务异常时能快速定位问题 以 tcp 协议为例 本文将对 Linux
  • 自己封装一个类express路由框架

    今天用了Node封装一个简单的类似express框架的路由 首先先看看 没封装 之前的server路由代码 const http require http const url require url const ejs require ej