作为开发人员,前后端交互过程中的请求传参是不陌生的,在很多场景中, 后端都需要解析我们前端请求中携带的参数, 做为数据库操作的条件。
比如以下几个场景,思考下怎么去设计接口传参:
场景一:
获取id=1的用户信息,接口应该怎么去设计传参呢?
GET /users?id=1
场景二:
用户注册了我们公司的账户,解析注册用户填写的信息保存至数据库
POST /users{name:’xiaoliang’,age:23}
首先,koa2中的请求传参可以通过request.query、request.body和params三种方式来实现。
其中,query是指URL中的查询参数,例如:http://localhost:3000/api/user?id=1&name=John,其中的id和name就是查询参数。用request.query和request.querystring查询结果如下:
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
const query = ctx.request.query;
console.log(query); // { id: '1', name: 'John' }
});
app.use(async (ctx) => {
const query = ctx.request.querystring;
console.log(query); // ‘id=1&name=John’
});
app.listen(3000);
request.body是解析请求中的body参数,需要格外注意的是koa2原生方式不支持解析body参数,必须借助中间件来实现,可以使用koa-bodyparser中间件来解析。koa-bodyparser会将POST请求中的原始数据解析成JSON格式,并挂载到ctx.request.body属性上。使用koa-bodyparser的代码如下:
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
app.use(bodyParser());
app.use(async (ctx) => {
const body = ctx.request.body;
console.log(body); // { id: '1', name: 'John' }
});
app.listen(3000);
最后,对于路由参数,则需要用到koa-router中间件来解析。koa-router可以将URL中的路由参数提取出来,并挂载到ctx.params属性上。使用koa-router的代码如下:
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
router.get('/api/user/:id', async (ctx) => {
const id = ctx.params.id;
console.log(id); // 1
});
app.use(router.routes());
app.listen(3000);
上述代码中,我们使用了koa-router来定义了一个路由/api/user/:id,并通过ctx.params获取到了其中的路由参数。
综上所述,koa2中的请求传参解析非常灵活,可以通过querystring、body和params三种方式来实现。对于不同的参数类型,我们可以使用koa2自带的模块或第三方中间件来进行解析。