上节回顾
-
@koa/router
的用法
- 用户路由的定义
-
koa
中间件的使用
-
Postman
基本测试
工做内容
- 后端:参数的获取
- 后端:数据库的写入与查询
- Postman:接口测试
准备工做
-
npm i -S koa-body
//对Post、Put、Patch
请求参数处理
业务逻辑
参数获取
支持荷载存储到ctx.request.body
// 更新文件:/server/app.js
const koa = require('koa');
const bodyParser = require('koa-body'); // 新增
const routes = require('./router');
const app = new koa();
app.use(bodyParser());// 新增:在处理请求数据的中间件前调用
//app.use((ctx, next) => {
// ctx.body = '测试测试测试';
// next();
//}) //无用代码删除
app.use(...router.routes).use(...router.allowedMethods);
routes.forEach(route => {
app.use(route);
});
app.on('error', err => {
log.error('server error', err)
});
module.exports = app;
更新注册&登陆路由
- 调用
POST
方法分别访问/users?action='register'
和/users?action='login'
。
- 经过
ctx.query
能够获取Url
上的参数。
// 更新文件:/server/router/users.js部分代码
...
{
path: '/',
method: 'POST',
handle: async (ctx) => {
const { action } = ctx.query;
switch (action) {
case 'register':
await register(ctx);
break;
case 'login':
await login(ctx);
break;
default:
await list(ctx);
}
}
},
...


注册逻辑
更新注册逻辑
// 更新文件:/server/control/user.js
const userModel = require('../model/user');
...
async function register (ctx) {
const { account, password } = ctx.request.body;//获取荷载
if (!account || !password) {
ctx.body = { // 返回json
code: '403',
data: null,
msg: '账号/密码不能为空'
}
return;
}
try {
const user = await userModel.findOne({ // 查看数据库是否已有数据
account
});
if (user) {
ctx.body = {
code: '403',
data: null,
msg: '用户已经存在'
}
} else {
const newUser = await new userModel({ // 新建数据
account,
password
}).save();
ctx.body = {
code: '200',
data: newUser,
msg: '注册成功'
}
}
} catch (err) {
ctx.body = {
code: '403',
data: null,
msg: err.message
}
}
}
...
- 经过
ctx.request.body
获取调用POST
方法传过来的参数
- 经过
userModel.findOne(<condition>)
查找匹配条件的数据
- 经过
new userModel(<Data>).save()
存储数据
测试逻辑
-
Body
面板 --> raw
--> JSON
格式 --> 输入参数 --> 查看结果

- 存储结果直接返回,会将
password
返回,这里自行过滤掉敏感信息。
数据库结果

登陆逻辑
更新注册逻辑
async function login (ctx) {
const { account, password } = ctx.request.body;
if(!account || !password) {
ctx.body = {
code: '404',
data: null,
msg: '参数不合法'
};
return;
}
const user = await userModel.findOne({
account,
password
});
if(user) {
ctx.body = {
code: '200',
data: user,
msg: '登录成功'
}
} else {
ctx.body = {
code: '404',
data: null,
msg: '账号/密码错误'
}
}
}
测试逻辑
-
Body
面板 --> raw
--> JSON
格式 --> 输入参数 --> 查看结果

常见问题
- 查看服务端是否启动
- 查看请求方式
Method
是否正确
- 多用断点调试问题
课后尝试
-
/server/app.js
中app.use(bodyParser())
注释掉,看看是否还能ctx.request.body
是否存在
- 用断点多看一下
ctx
的结构
参考文档
koa-body
mongoosejs#Model Apihtml