Koa & Mongoose & Vue实现前后端分离--05服务端注册&登录:业务逻辑
上节回顾
-
@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
的结构
参考文档
阅读 1.2k
1.2k 声望
68 粉丝
0 条评论
得票最新