资讯专栏INFORMATION COLUMN

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

DataPipeline / 2083人阅读

摘要:前言是目前用的比较多的的路由中间件之一,前段时间由于作者没有精力继续维护而将其公开售卖。我们有些项目也用到了这个库,但是目前很多我们想要的特性都没有,比如生成接口文档。本身这个库代码实现还比较简单,因此综合考虑打算重写一个。

前言

koa-router 是目前用的比较多的 Koa 的路由中间件之一,前段时间由于作者没有精力继续维护而将其公开售卖。我们有些项目也用到了这个库,但是目前很多我们想要的特性都没有,比如生成接口文档。本身这个库代码实现还比较简单,因此综合考虑打算重写一个。

项目地址:https://github.com/d-band/koa...

特性:

支持几乎所有的 koa-router 特性

支持 params 校验

params 支持从 path, header, query, cookie 中获取

支持 body parser

支持 request body 校验

支持参数类型自动转换

支持自动生成 OpenAPI

简单例子:

index.js

import Koa from "koa";
import Mapper from "koa-mapper";
import * as service from "./service";

const Mapper = new Mapper();

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);

// open http://localhost:3000/openapi.json

service.js

export async function getProjects(ctx) {
  const { id, status, token } = ctx.params;

  await checkToken(id, token);

  ctx.body = await Project.findAll({
    where: {
      userId: id,
      status: { $in: status }
    }
  });
}

export async function addProject(ctx) {
  const { body } = ctx.request;

  ctx.body = await Project.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: 路由名称

params: 请求参数定义

body: 请求 Body 定义

其他 OpenAPI 中 Operation Object 的参数

options.params 为请求参数定义,如:

params = {
  id: { type: "number" },
  name: { type: "string", in: "query" },
  user: { type: "User", in: "query" }
}

type: 参数类型,包含基本类型(numberstringintegerdatetimedatetime),数组类型(array),自定义类型(如 User),自定义数组类型(array),多个类型(number|string

in: 参数来源,包含 path,header,query,cookie

其他 OpenAPI 中 Parameter Object 的参数

自定义类型
mapper.define(schemaName, properties, options);
// or
mapper.schema(schemaName, properties, options);

支持类型组合,如:

mapper.schema("Status", {
  id: { type: "integer" },
  name: { type: "string" }
}, {
  required: ["id"]
});
mapper.schema("Project", {
  id: { type: "number", required: true },
  name: { type: "string", required: true },
  status: { type: "array", required: true }
});

支持继承,如:

mapper.schema("Model", {
  id: { type: "number" },
  createdAt: { type: "datetime" },
  updatedAt: { type: "datetime" }
});
mapper.schema("User: Model", {
  name: { type: "string" }
});
Body Parser
mapper.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.body;
});
结尾

目前 koa-mapper 刚发布,测试覆盖率达到 100%,有哪些有兴趣的小伙伴欢迎一起维护。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109005.html

相关文章

  • 从零搭建Koa2 Server

    摘要:于是翻遍与各大网站,都没找到一个好用的轻一点的脚手架,也找不到一个清晰些的搭建介绍。现在把搭建过程介绍下,看能不能方便下入门的同学。创建一个文件夹,命名。记得先装好以上版本一路回车,根据提示输入信息。但这只是初步的搭建了下。 前几天想写个小爬虫程序,准备后端就用koa2。于是翻遍github与各大网站,都没找到一个好用的、轻一点的koa2脚手架,也找不到一个清晰些的搭建介绍。githu...

    JellyBool 评论0 收藏0
  • GraphQL 搭配 Koa 最佳入门实践

    摘要:如下图嗯,如图都已经查询到我们保存的全部数据,并且全部返回前端了。如图没错,什么都没有就是查询服务的界面。写好了之后我们在配置一下路由,进入里面,加入下面几行代码。 GraphQL一种用为你 API 而生的查询语言,2018已经到来,PWA还没有大量投入生产应用之中就已经火起来了,GraphQL的应用或许也不会太远了。前端的发展的最大一个特点就是变化快,有时候应对各种需求场景的变化,不...

    MoAir 评论0 收藏0
  • 不到300行代码构建精简的koa和koa-router(mini-koa)

    摘要:详细代码如下追踪赋值里面的是子路由设计子路由设计这个比较简单,每个子路由维护一个路由监听列表,然后通过调用的函数添加到主路由列表上。 showImg(https://segmentfault.com/img/bVbruD0?w=756&h=378); 前言 鉴于之前使用express和koa的经验,这两天想尝试构建出一个koa精简版,利用最少的代码实现koa和koa-router,同时...

    tuomao 评论0 收藏0
  • Koa v2.x 中文文档 Koa 对比 Express

    摘要:使用承诺和异步功能来摆脱回调地狱的应用程序,并简化错误处理。它暴露了自己的和对象,而不是的和对象。因此,可被视为的模块的抽象,其中是的应用程序框架。这使得中间件对于整个堆栈而言不仅仅是最终应用程序代码,而且更易于书写,并更不容易出错。 Koa 与 Express 此系列文章的应用示例已发布于 GitHub: koa-docs-Zh-CN. 可以 Fork 帮助改进或 Star 关注更新...

    summerpxy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<