koa-better-body 在新版本中并不提供body解析功能

新版本仅仅只提供文件,表单,或者Ajax JSON的请求解析,而且从 koa-better-router 的不支持参数匹配来看,这2个插件配合起来更适合做 restful api 。假如我们要解析url上面的参数,所以我们还需要自己再弄一个body解析的插件。

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

再次修改我们的 index.ts,这里我们选择老的版本是因为我当前的node是6.9,而且typescript并不支持将引入的模块也进行编译降级处理,除非我们用webpack或者其他的打包工具,这里为了简单就直接使用老一点的版本。

  1. import * as Koa from 'koa';
  2. import * as OtherParser from 'koa-better-body';
  3. import * as bodyParser from 'koa-bodyparser';
  4. import * as Router from 'koa-better-router';
  5. import * as Convert from 'koa-convert';
  6. const router = Router().loadMethods();
  7. const app = new Koa();
  8. router.get('/hello', async (ctx, next) => {
  9. console.log(ctx.request.body);
  10. ctx.body = `Hello world! Prefix: ${ctx.route.prefix}`
  11. await next()
  12. });
  13. router.post('/upload/:id', async (ctx, next) => {
  14. console.log(ctx.request.files)
  15. console.log(ctx.request.fields)
  16. // there's no `.body` when `multipart`,
  17. // `urlencoded` or `json` request
  18. console.log(ctx.request.body);
  19. // print it to the API requester
  20. ctx.body = JSON.stringify({
  21. fields: ctx.request.fields,
  22. files: ctx.request.files,
  23. body: ctx.request.body || null
  24. }, null, 2)
  25. await next();
  26. })
  27. router.get('/foobar', async (ctx, next) => {
  28. ctx.body = `Foo Bar Baz! ${ctx.route.prefix}`
  29. await next()
  30. })
  31. const api = Router({ prefix: '/api' })
  32. api.extend(router)
  33. app.use(Convert(bodyParser()));
  34. app.use(Convert(OtherParser()));
  35. app.use(router.middleware());
  36. app.use(api.middleware());
  37. app.listen(3000, () => {
  38. console.log("Server Stared on http://localhost:3000")
  39. });

当然我们后面可能并不会用到 body,这里仅仅只是把这个坑提一下,其实我们手动解析一下也非常简单,使用 ctx.querystring,通过 split 就可以直接拿到。

  1. let str = 'a=2&b=3'
  2. let arr = str.split('&')
  3. arr.reduce((prev,i) => (prev[i.split('=')[0]] = i.split('=')[1], prev),{})
  4. // { a: 2, b: 3}