# CGEM **Repository Path**: baigem/cgem ## Basic Information - **Project Name**: CGEM - **Description**: 适合个人使用的node后端框架 - **Primary Language**: JavaScript - **License**: EPL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-05-17 - **Last Updated**: 2021-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Node_CGEM #### 介绍 适合个人使用的node后端框架 2021 9.15 自动挂载 无法清除删除的接口 已修复 自动挂载 会输出文件名 已修复 热部署异常未捕捉 已修复 注解监控如文件中没有注解不进行提示 已修复 请求解析post type.startsWith 报异常,需要捕捉 已修复 2021 9 28 需要提供异步返回的锁定,不然会导致返回数据为空 已修复 2021 10.31 自动加载只能加载get接口 已修复 ctx.request.$file 中可能保存了未定义 已修复 控制器出现异常时会直接退出程序 已修复 md5方法只能使用一次 已修复 2021 11.1 cookie未封装 已修复 cookie的设置未兼容不同数据 已修复 自动加载后面的接口会继承前面设置的中间件 已修复 注解正则不精确 [\\s{},]* 已修复 添加自动加载中间件 已完成 public目录文件无法下载 已修复 cookie解析bug / ;|; /g 已修复 注解参数使用单引号会报错 已修复 文件解析后的写入方法报错 已修复 注解匹配class中的方法匹配错误 已修复 2021 11.3 中间件自动加载需要进行删除缓存后导入 已修复 参数自动解析数值字符串,如果过大会导致转换后内容错误 已修复 解决OPTIONS请求会404的问题 不需要修复,可添加插件解决 2021 11.5 扩展cors需要对cookie添加Secure; SameSite=None 已修复 2021 11.6 mysql 的orWhere 出现错误 select * from account_info where title like ? or accountlike ? 已修复 2021 11.7 mysql的orWhere第4个参数解析会出错 重定向有问题 已修复 跨域插件需要对锁进行判定 已修复 2021 11.8 addRouter方法接受对象作为参数时,如果没有赋予中间件参数,将得到[ undefined ]导致报错 已修复 annotation需要捕捉下异常 已修复 2021.11.12 如果使用ts开发项目,那注解会与官方注解冲突,只能使用/**/包裹 无法修复:暂时无解,tsc会根据注解插入编译后的文件中 加载中间件后,中间件没办法热更新 已修复 npm install cgem 就可安装使用 下面的时使用教程目录 > 1. 安装以及使用 2. 创建接口实例 3. 特殊接口的实例 4. 中间件的两种使用方法(还有第三中) 5. 注解的使用 6. 自动装载的使用 7. 配置化的使用 8. 配置文件详解 > ### 1.安装以及使用 ``` let app = require("cgem"); // 直接启动 app.start(); ``` ### 2.创建接口实例 ``` let app = require("cgem"); // 创建get接口 app.get("/get",(req)=>{ return "我是get接口" }) // 创建post接口 app.post("/post",(req)=>{ return "我是post接口" }) // 获取前端传来的参数(get,post获取参数的方式相同) app.get("/getName",(req)=>{ let data = [ // 获取全部参数 req.$all(), // 获取单个参数的两种方式 "你的名字叫"+req.$all("name"), // 获取单个参数 "你的名字叫"+req.name ]; return data; }) // 创建路由参数,路由参数会被作为控制器的参数 app.get("/route_par/:id/:name",(req,id,name)=>{ let data = [ "你的id为"+id+",你的名字为"+name, "你的id为"+req.id+",你的名字为"+req.name, "你的id为"+req.$all("id")+",你的名字为"+req.$all("name"), ] return data; }); app.start(); ``` ### 3.特殊接口的实例 ``` // 特殊接口有3个 404 500 public let app = require("cgen") // 404 接口 顾名思义只有在找不到接口时才会调用的接口 app.$404((req)=>{ return "重写404接口成功" }); // 500 接口 顾名思义就是服务器报错时调用的接口 app.$500((req,err)=>{ // 这里可以对错误进行保存本地 return "服务器报错了,错误为:"+err.message; }); // public 接口 就是在前端的请求地址在public地址中确实存在这个文件时调用 // 注意 public 只是一个地址的称呼,默认的public地址就是项目根目录的public文件夹,这个地址是可更改的 app.$public((req)=>{ // 这里可以对文件进行缓存 return "你访问了 "+req.filepath+" 文件" }) app.start(); ``` ### 4.中间件的两种使用方法(还有第三中) ``` let app = require("cgem"); // 比如登录接口,前端传来两个参数user 与 pass // 第一种方式 app.get("/login",()=>{ return "通过了中间件的检查" }).midd((req,res,next)=>{ // 判断有没有账号和密码 if(req.$all("user") === undefined) return "被中间件拦截,因为没有user参数" if(req.$all("pass") === undefined) return "被中间件拦截,因为没有pass参数" },(req,res,next)=>{ // 第二个中间件.....暂时不做别的验证 }) // 第二种方式 app.get("/login2",()=>{ return "通过了中间件的检查" }).midd([ // ...的意思是接受剩下的所有参数 (req,res,next,...data)=>{ // 循环遍历有没有 user 和pass 参数 for(let key of data){ if(req.$all(key) === undefined) return "被中间件拦截,因为没有"+key+"参数" } }, // 这是传递给中间件的参数,以逗号分割 "user,pass" ]) // next 参数的作用 app.get("/next",()=>{ return "访问next成功" }).midd(async (req,res,next)=>{ // next 是继续下一个中间件|控制器的意思 这是一个异步方法 let data = await next(); // data是接下来中间件或控制器的返回结果 console.log(data) ` next().then(data=>{ 这样也是可以的 }) ` // next中也可以给一个控制器,进行重定向控制器 }) app.start(); ``` ### 5.注解的使用 ``` /** * 注解可以在项目启动的时候进行一次运行,进而配置一些东西 * 注解是与方法绑定的,因此注解必须写在方法的上面 * 注解必须设置<注解运行地址> 在这个地址中才能运行注解 * 注解必须要添加之后才能使用 */ let app = require("cgem") app.config.addrunAnnotation("/"); // 添加一个注解, 因为注解会分析这个文件,所以才使用"@"+"cs"这种方式,正常不会这种写法 app.config.addAnnotation("@"+"cs",(filepath,methodName,state)=>{ /** * filepath 使用这个注解的文件路径 * methodName 注解绑定的方法名 * state 执行的这个注解是不是这个文件最后一个执行的注解 */ console.log([ filepath, methodName, state ]) console.log("注解执行成功"); }) app.start(); /** * 这样就把cs注解与aaa绑定了 * @cs */ exports.aaa = ()=>{} ``` ### 6.自动装载的使用 ``` let app = require("cgem"); // 自动装载需要分离控制器才能使用 // 设置控制器所在的文件夹 在项目根目录的 controller 文件夹中 app.config.setController("/controller"); // 在文件夹中创建a.js控制器文件,以下是a文件中的内容 ` /** * 声明这是一个控制器文件,这个文件中所有通过注解生成的接口都将拥有/a前缀 * 如果不设置前缀,可不添加括号如@Controller,此规则适用所有注解 * @Controller("/a") * 这个文件中所有通过注解生成的接口都将通过以下中间件的验证 * @Middleware() */ /** * 生成一个get接口 /a/cc * @GetMapping("/cc") * 这个接口需要通过以下中间件验证 * @Midd() */ exports.ccc = ()=>{ return "访问成功" } ` app.start(); ``` ### 7.配置化的使用 ``` let app = require("cgem"); // 配置化的意思就是在不创建配置文件的情况下能正常使用框架绝大部分功能 // 直接通过app.config提供的方法进行配置 // 设置控制器文件夹 app.config.setController("/controller"); // 设置中间件文件夹 app.config.setMiddleware("/middleware") // 设置注解文件夹 app.config.setAnnotation("/annotation"); //添加中间件========================================================== app.config.addMiddleware("a",()=>{}) // 会自动寻找中间件文件夹下的b中间件文件 app.config.addMiddleware("b","/middleware/b") // 设置了中间件文件夹可以省略前缀 app.config.addMiddleware("bb","b") //================================================================== //添加注解=========================================================== app.config.addAnnotation("@a",()=>{}) // 会自动寻找注解下的b注解文件 app.config.addAnnotation("@aa","/annotation/a") // 设置了注解文件夹可以省略前缀 app.config.addAnnotation("@aa","a") //================================================================== //创建接口========================================================== app.get("/gem",()=>{}) // 控制器会被自动解析为控制器文件夹下的a文件中的b方法 // 中间件被添加后,可直接使用,以:分割参数,以逗号分割不同参数 app.get("/gems","a@b").midd("a:参数1,参数2","b:参数1,参数2") //================================================================= //添加路由文件======================================================== app.config.addRouter({ // 路由文件地址 path:"/api.js", // 文件中接口的前缀 prefix:"/api", // 文件中接口需要经过的中间件 middleware:["a","b"] }) app.start(); ``` ### 8.配置文件详解 ``` // 在项目根目录创建cgem.config.json { // 服务启动地址以及端口 server:{ // 启动的ip地址 host:"0.0.0.0", // 启动的端口号 port: 8088 }, // 各大重要模块的地址 address:{ // 中间件地址 controller:"", // 中间件地址 middleware:"", // 注解地址 annotation:"", // 公共资源地址 public:"" }, // 特性是否启动 features :{ // 热部署是否启动,主要用于控制器,路由文件,注解的热部署 hotDeployment:true }, // 全局中间件,项目所有的接口都需要经过全局中间件的验证 global_middleware:["中间件1","中间件2","中间件3"], // 中间件的配置 middleware:{"中间件1":"地址"}, // 注解的配置 annotation:{"注解1":"地址"}, // 运行注解的地址 runAnnotation:["地址1","地址2"], // 路由文件配置 routeConfig:[ { path:"", prefix:"", middleware:[] } ], // 特殊接口的配置 special:{ 404:{ path:"", middleware:[], parameter:"", }, 500:{}, public:{} }, // 语法糖的配置 pathSugar:{ // @将导向地址 "@":"地址" } } ```