成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

讓我們來(lái)重新設(shè)計(jì)一下 koa-router

DataPipeline / 2156人閱讀

摘要:前言是目前用的比較多的的路由中間件之一,前段時(shí)間由于作者沒(méi)有精力繼續(xù)維護(hù)而將其公開(kāi)售賣(mài)。我們有些項(xiàng)目也用到了這個(gè)庫(kù),但是目前很多我們想要的特性都沒(méi)有,比如生成接口文檔。本身這個(gè)庫(kù)代碼實(shí)現(xiàn)還比較簡(jiǎn)單,因此綜合考慮打算重寫(xiě)一個(gè)。

前言

koa-router 是目前用的比較多的 Koa 的路由中間件之一,前段時(shí)間由于作者沒(méi)有精力繼續(xù)維護(hù)而將其公開(kāi)售賣(mài)。我們有些項(xiàng)目也用到了這個(gè)庫(kù),但是目前很多我們想要的特性都沒(méi)有,比如生成接口文檔。本身這個(gè)庫(kù)代碼實(shí)現(xiàn)還比較簡(jiǎn)單,因此綜合考慮打算重寫(xiě)一個(gè)。

項(xiàng)目地址:https://github.com/d-band/koa...

特性:

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

支持 params 校驗(yàn)

params 支持從 path, header, query, cookie 中獲取

支持 body parser

支持 request body 校驗(yàn)

支持參數(shù)類型自動(dòng)轉(zhuǎn)換

支持自動(dòng)生成 OpenAPI

簡(jiǎn)單例子:

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 為可選參數(shù),包含:

name: 路由名稱

params: 請(qǐng)求參數(shù)定義

body: 請(qǐng)求 Body 定義

其他 OpenAPI 中 Operation Object 的參數(shù)

options.params 為請(qǐng)求參數(shù)定義,如:

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

type: 參數(shù)類型,包含基本類型(number、string、integerdatetime、datetime),數(shù)組類型(array),自定義類型(如 User),自定義數(shù)組類型(array),多個(gè)類型(number|string

in: 參數(shù)來(lái)源,包含 path,header,query,cookie

其他 OpenAPI 中 Parameter Object 的參數(shù)

自定義類型
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;
});
結(jié)尾

目前 koa-mapper 剛發(fā)布,測(cè)試覆蓋率達(dá)到 100%,有哪些有興趣的小伙伴歡迎一起維護(hù)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/109005.html

相關(guān)文章

  • 從零搭建Koa2 Server

    摘要:于是翻遍與各大網(wǎng)站,都沒(méi)找到一個(gè)好用的輕一點(diǎn)的腳手架,也找不到一個(gè)清晰些的搭建介紹。現(xiàn)在把搭建過(guò)程介紹下,看能不能方便下入門(mén)的同學(xué)。創(chuàng)建一個(gè)文件夾,命名。記得先裝好以上版本一路回車(chē),根據(jù)提示輸入信息。但這只是初步的搭建了下。 前幾天想寫(xiě)個(gè)小爬蟲(chóng)程序,準(zhǔn)備后端就用koa2。于是翻遍github與各大網(wǎng)站,都沒(méi)找到一個(gè)好用的、輕一點(diǎn)的koa2腳手架,也找不到一個(gè)清晰些的搭建介紹。githu...

    JellyBool 評(píng)論0 收藏0
  • GraphQL 搭配 Koa 最佳入門(mén)實(shí)踐

    摘要:如下圖嗯,如圖都已經(jīng)查詢到我們保存的全部數(shù)據(jù),并且全部返回前端了。如圖沒(méi)錯(cuò),什么都沒(méi)有就是查詢服務(wù)的界面。寫(xiě)好了之后我們?cè)谂渲靡幌侣酚桑M(jìn)入里面,加入下面幾行代碼。 GraphQL一種用為你 API 而生的查詢語(yǔ)言,2018已經(jīng)到來(lái),PWA還沒(méi)有大量投入生產(chǎn)應(yīng)用之中就已經(jīng)火起來(lái)了,GraphQL的應(yīng)用或許也不會(huì)太遠(yuǎn)了。前端的發(fā)展的最大一個(gè)特點(diǎn)就是變化快,有時(shí)候應(yīng)對(duì)各種需求場(chǎng)景的變化,不...

    MoAir 評(píng)論0 收藏0
  • 不到300行代碼構(gòu)建精簡(jiǎn)的koa和koa-router(mini-koa)

    摘要:詳細(xì)代碼如下追蹤賦值里面的是子路由設(shè)計(jì)子路由設(shè)計(jì)這個(gè)比較簡(jiǎn)單,每個(gè)子路由維護(hù)一個(gè)路由監(jiān)聽(tīng)列表,然后通過(guò)調(diào)用的函數(shù)添加到主路由列表上。 showImg(https://segmentfault.com/img/bVbruD0?w=756&h=378); 前言 鑒于之前使用express和koa的經(jīng)驗(yàn),這兩天想嘗試構(gòu)建出一個(gè)koa精簡(jiǎn)版,利用最少的代碼實(shí)現(xiàn)koa和koa-router,同時(shí)...

    tuomao 評(píng)論0 收藏0
  • Koa v2.x 中文文檔 Koa 對(duì)比 Express

    摘要:使用承諾和異步功能來(lái)擺脫回調(diào)地獄的應(yīng)用程序,并簡(jiǎn)化錯(cuò)誤處理。它暴露了自己的和對(duì)象,而不是的和對(duì)象。因此,可被視為的模塊的抽象,其中是的應(yīng)用程序框架。這使得中間件對(duì)于整個(gè)堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書(shū)寫(xiě),并更不容易出錯(cuò)。 Koa 與 Express 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新...

    summerpxy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<