# 1. 前言

koa-router 提供了 .get.post.put.del 接口来处理各种请求,但在实际业务中,我们更多的是会接触到 POSTGET 这两种请求,服务端接收请求少不了解析请求所携带的参数,所以接下来我们就针对这两种类型的请求来说明一下如何解析请求所携带的参数。

# 2. GET 请求

# 2.1 解析 URL 具名参数

http://localhost:3000/user/12/nlrx
1

在请求的 URL 中,带冒号的占位参数是具名参数,一般常用于 RESTful API 中,比如查询某个用户,对应的地址通常是 /users/:id/:namekoa-router 里内置了 ctx.params ,使用它可以轻松获取具名参数。代码如下:

router.get("/user/:id/:name", async (ctx: Koa.Context, next: Koa.Next) => {
  console.log(ctx.params);
  ctx.body = ctx.params;
});
1
2
3
4

将上述代码添加到 app.ts 中,保存文件并通过浏览器访问 http://localhost:3000/user/12/nlrx ,可以看到请求参数已经被正确解析拿到了。

# 2.2 解析 URL 查询字符串

http://localhost:3000/user?age=18&name=nlrx
1

对于上述这种在 URL 后面通过查询字符串的方式所携带的参数, koa-router 封装 query 方法或 querystring 方法可以直接获取到,唯一不同的是 query 返回的是对象,而 querystring 返回的是字符串。代码如下:

router.get("/user", async (ctx: Koa.Context, next: Koa.Next) => {
  console.log("ctx.query:", ctx.query);
  console.log("ctx.querystring:", ctx.querystring);
});
1
2
3
4

将上述代码添加到 app.ts 中,保存文件并通过浏览器访问 http://localhost:3000/user?age=18&name=nlrx ,然后打开控制台会看到下面的输出内容:

ctx.query: { age: '18', name: 'nlrx' }
ctx.querystring: age=18&name=nlrx
1
2

# 3. POST 请求

当用 post 方式请求时,我们会遇到一个问题: post 请求通常都会通过表单或 JSON 形式发送,而无论是 Node 还是 Koa ,都 没有提供 解析 post 请求参数的功能。所以我们需要借助第三方中间件 koa-bodyparser 来解析请求体。

body-parser 是一个 HTTP 请求体解析中间件,可用于解析 JSONRaw 、文本、 URL-encoded 等格式的请求体,也是 Express 框架中的请求体解析中间件。在 Koa 中, body-parser 对应的中间件是 koa-bodyparser ,且 koa-bodyparser 的用法更简单。如果包含 key-value 的数据是在请求体里被提交给服务器的, koa-bodyparser 的默认值就是 undefined ,只有通过 bodyparser 进行解析才能正常使用。

由于是第三方提供的中间件,所以老规矩,使用前先安装:

# 安装 koa-bodyparser
npm i koa-bodyparser

# 安装类型声明文件
npm i @types/koa-bodyparser -D
1
2
3
4
5

安装完成之后,我们需要在 app.js 中引入中间件并应用,代码如下:

import * as Koa from "koa";
import * as Router from "koa-router";
// 引入 koa-bodyparser
import * as bodyParser from "koa-bodyparser";
const app = new Koa();
const router = new Router();

// 注册中间件
app.use(bodyParser());

// 添加路由
router.post("/user", async (ctx: Koa.Context, next: Koa.Next) => {
  const { name, age } = ctx.request.body;
  ctx.body = {
    name,
    age,
  };
});

app.use(router.routes()).use(router.allowedMethods());

app.listen("3000", () => {
  console.log("server is running at http://localhost:3000");
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

将以上代码复制到 app.ts 文件中并保存文件,对于 POST 请求我们需要借助第三方工具 postman 来测试,如下:

可以看到, koa-bodyparser 中间件会解析请求体里的内容,并将解析结果赋值给 ctx.request.body ,我们从 ctx.request.body 里可以取到解析后的内容,就可以进行下一步处理了。