当前位置: 首页 > 后端技术 > Node.js

让我们重新设计一下koa-router

时间:2023-04-03 19:53:35 Node.js

前言koa-router是目前使用最广泛的Koa路由中间件之一。前段时间因为作者没有精力继续维护,所以公开卖掉了。我们的一些项目也使用了这个库,但是目前很多我们想要的功能都没有,比如生成接口文档。库代码实现本身比较简单,综合考虑后打算重写一个。项目地址:https://github.com/d-band/koa...特点:支持几乎所有的koa-router特性,支持params,verifyparams,支持getfrompath,header,query,cookie,supportbodyparser,支持请求体验证支持参数类型自动转换支持OpenAPI自动生成简单示例:index.jsimportKoafrom'koa';importMapperfrom'koa-mapper';import*asservicefrom'./service';constMapper=newMapper();mapper.get('/users/:id/projects',{params:{id:{type:'number'},status:{type:'array',in:'query'},token:{type:'string',in:'header'}}},service.getProjects);mapper.post('/users/:id/projects',{params:{id:{type:'number'}},body:'Project'},service.addProject);mapper.schema('Project',{id:{type:'number',required:true},name:{type:'string',required:true},status:{type:'array',required:true}});mapper.schema('Status',{id:{type:'integer'},name:{type:'string'}},{required:['id','name']});app.use(mapper.routes());app.use(mapper.allowedMethods());app.listen(3000);//打开http://localhost:3000/openapi.jsonservice.jsexportasyncfunctiongetProjects(ctx){const{id,status,token}=ctx.params;等待checkToken(id,token);ctx.body=awaitProject.findAll({where:{userId:id,status:{$in:status}}});}导出异步函数addProject(ctx){const{body}=ctx.request;CTX。body=awaitProject.create({...body,userId:id});}路由定义:mapper.get(path,[options],...middlewares);mapper.post(path,[options],...middlewares);mapper.put(path,[options],...middlewares);mapper.del(path,[options],...middlewares);...options为可选参数,包括:name:Routenameparams:Requestparameterdefinitionbody:RequestBody定义了OpenAPIoptions中OperationObject的其他参数。params为请求参数定义,如:params={id:{type:'number'},name:{type:'string',in:'query'},user:{type:'User',in:'query'}}type:参数类型,包括基本类型(number、string、integer、date、time、datetime)、数组类型(array)、自定义类型(如User)、自定义数组类型(array),multipletypes(number|string)in:parametersource,包括OpenAPI中ParameterObject的path、header、query、cookie等参数。自定义类型mapper.define(schemaName,properties,options);//ormapper.schema(schemaName,properties,options);支持类型组合,例如:mapper.schema('Status',{id:{type:'integer'},name:{type:'string'}},{required:['id']});mapper.模式('项目',{id:{类型:'数字',需要:真},名称:{类型:'字符串',需要:真},状态:{类型:'数组<状态>',需要:真}});支持继承,如:mapper.schema('Model',{id:{type:'number'},createdAt:{type:'datetime'},updatedAt:{type:'datetime'}});mapper.schema('User:Model',{name:{type:'string'}});BodyParsermapper.post('/users',{body:'User'},(ctx)=>{const{id,name}=ctx.request.body;});支持文件上传,如:mapper.post('/uploadImage',{bodyparser:{multipart:true},body:{user:{type:'number'},image:{type:'file'}}},(ctx)=>{const{user,image}=ctx.request。身体;});到最后,koa-mapper刚刚发布,测试覆盖率已经达到100%。欢迎有兴趣的朋友一起维护