安装 body 解析插件

koa 仅仅只提供最简单的功能,而不提供请求的body解析,所以我们需要一个解析body的插件。所有的插件我们都可以在这里找到。

  1. npm install koa-better-body -S

我们自己来写代码提示文件,在 node_modules/@types 目录下面新建 koa-better-body 文件夹,再在里面新建 index.d.ts

我为什么要把这个文件写在@types目录下,而不是在 tsconfig.json 里面重新增加一个 typeRoots 路径,是因为只有在@types目录下面才会被解析成模块。

假如我们不知道怎么写,我们首先安装一个同类型的插件,仿照着写。

  1. npm i @types/koa-bodyparser -D

这样我们就可以仿照 koa-bodyparser 的代码提示文件写了。

插件的配置项具体是什么类型,在这里可以找到。

完成的文件如下

  1. import * as Koa from 'koa';
  2. import * as formidable from 'formidable';
  3. declare module "koa"{
  4. interface Request {
  5. body: any,
  6. files: any,
  7. fields: any
  8. }
  9. }
  10. declare function bodyParser(opts? : {
  11. fields?: boolean | string,
  12. files?: boolean | string,
  13. multipart?: boolean,
  14. textLimit?: string,
  15. formLimit?: string,
  16. urlencodedLimit?: string,
  17. jsonLimit?: string,
  18. bufferLimit?: string,
  19. jsonStrict?: boolean,
  20. detectJSON?: () => any,
  21. strict?: boolean,
  22. onerror?: () => any,
  23. extendTypes?: Object,
  24. IncomingForm?: formidable.IncomingForm,
  25. handler?: GeneratorFunction,
  26. querystring?: Object,
  27. qs?: Object,
  28. delimiter?: string,
  29. sep?: string,
  30. buffer?: boolean
  31. }): Koa.Middleware;
  32. declare namespace bodyParser {}
  33. export = bodyParser;

安装路由插件

  1. npm install koa-better-router -S

以同样的方式,我们创建@types/koa-better-router/index.d.ts

  1. npm i @types/koa-router -D

我们可以仿照 koa-router 写,当然我们前提已经看完了 koa-better-router README.md 的 API。

  1. import * as Koa from 'koa';
  2. declare class Router{
  3. routes: Array<any>;
  4. get(path: string, fn: (ctx: Router.IRouteContext, next: () => Promise<any>) => any) : any;
  5. post(path: string, fn: (ctx: Router.IRouteContext, next: () => Promise<any>) => any): any;
  6. put(path: string, fn: (ctx: Router.IRouteContext, next: () => Promise<any>) => any): any;
  7. del(path: string, fn: (ctx: Router.IRouteContext, next: () => Promise<any>) => any): any;
  8. loadMethods() : Router;
  9. createRoute(method: string, path: string | Function,fn?: any, ...args: Function[]) : Object;
  10. addRoute(method: string, path: string | Function,fn?: any, ...args: Function[]) : Object;
  11. getRoute(method: string, path: string | Function, fn?: any, ...args: Function[]) : Object;
  12. addRoutes(...fn: Array<any>) : Router;
  13. getRoutes() : any[];
  14. groupRoutes(dest: any, src1: any, src2: any) : any;
  15. extend(router: Object): Router;
  16. middleware(): Koa.Middleware;
  17. legacyMiddleware(): GeneratorFunction;
  18. }
  19. declare module "koa"{
  20. interface Context {
  21. params: any
  22. }
  23. }
  24. declare namespace Router{
  25. export interface IRouteContext extends Koa.Context{
  26. route: any
  27. }
  28. export interface IOptions {
  29. notFound?: (ctx: IRouteContext, next: () => Promise<any> ) => any;
  30. prefix?: string
  31. }
  32. }
  33. declare function RouterFactory(opts? : Router.IOptions) : Router;
  34. declare namespace RouterFactory {}
  35. export = RouterFactory

Convert

当我们使用此刻的这些插件的时候,可能会抛出一个警告,所以我们需要 koa-convert 这个工具。

  1. npm i koa-convert -S

此时修改我们的 index.ts

  1. import * as Koa from 'koa';
  2. import * as bodyParser from 'koa-better-body';
  3. import * as Router from 'koa-better-router';
  4. import * as Convert from 'koa-convert';
  5. const router = Router().loadMethods();
  6. const app = new Koa();
  7. router.get('/hello', async (ctx, next) => {
  8. ctx.body = `Hello world! Prefix: ${ctx.route.prefix}`
  9. await next()
  10. });
  11. router.get('/foobar', async (ctx, next) => {
  12. ctx.body = `Foo Bar Baz! ${ctx.route.prefix}`
  13. await next()
  14. })
  15. const api = Router({ prefix: '/api' })
  16. api.extend(router)
  17. app.use(Convert(bodyParser()));
  18. app.use(router.middleware());
  19. app.use(api.middleware());
  20. app.listen(3000, () => {
  21. console.log("Server Stared on http://localhost:3000")
  22. });

运行起来,看一看。