实现注册接口
大致流程:
1、配置路由接口
通过在 router.js 将接口抛出
'use strict'; /** * @param {Egg.Application} app - egg application */ module.exports = app => { const { router, controller } = app; // 注册路由 router.post('/api/user/register', controller.user.register); };
2、获取账号密码
我们首先需要获取到用户填写的账号密码,在 controller 目录下新建 user.js 用于处理用户逻辑相关的代码。
// 获取注册时的 username, password const { username, password } = ctx.request.body;
3、进行账号密码校验
1、判断两个参数是否为空
// 1、判空操作 if (!username || !password) { ctx.body = { status: 500, desc: '账号密码不能为空', data: null } return }
2、需要根据用户传入的 username 去数据库的 user 表查询,是否已经被注册。
在 service 文件夹里 新增 user.js 文件。
'use strict'; const Service = require('egg').Service; class UserService extends Service { // 通过用户名获取用户信息 async getUserByName(username) { const { app } = this; try { const result = await app.mysql.get('user', { username }); return result; } catch(error) { console.log(error); return null; } } } module.exports = UserService;
在 controller 里 user.js 继续添加逻辑
// 2、验证数据库内是否已经有该账户名 const userInfo = await ctx.service.user.getUserByName(username); // 判断是否已经存在 if(userInfo && userInfo.id) { ctx.body = { status: 500, desc: '账户名已被注册,请重新输入', data: null } return }
4、将数据存入数据库
添加写入数据库的方法:在 service 文件夹 user.js 文件 里添加注册 register 方法。
// 注册 async register(params) { const { app } = this; try { const result = await app.mysql.insert('user', params); return result; } catch(error) { console.log(error); return null; } }
在 controller 里 user.js 继续添加逻辑,完整的代码如下
'use strict'; const Controller = require('egg').Controller; // 默认头像 const defaultAvatar = 'https://profile.csdnimg.cn/A/C/5/1_kaimo313'; class UserController extends Controller { async register() { try { const { ctx } = this; // 获取注册时的 username, password const { username, password } = ctx.request.body; console.log('注册获取参数', username, password) // 1、判空操作 if (!username || !password) { ctx.body = { status: 500, desc: '账号密码不能为空', data: null } return } // 2、验证数据库内是否已经有该账户名 const userInfo = await ctx.service.user.getUserByName(username); // 判断是否已经存在 if(userInfo && userInfo.id) { ctx.body = { status: 500, desc: '账户名已被注册,请重新输入', data: null } return } // 3、调用 service 方法,将数据存入数据库。 const result = await ctx.service.user.register({ username, password, signature: '这个人很懒,没什么留言', avatar: defaultAvatar, ctime: new Date() }); console.log('数据存入数据库--->', result); if (result) { ctx.body = { status: 200, desc: '注册成功', data: null } } else { ctx.body = { status: 500, desc: '注册失败', data: null } } } catch (error) { ctx.body = { status: 500, desc: '注册失败', data: null } } } } module.exports = UserController;
测试注册接口
首先需要将 ctime 字段改成 datetime 类型,上一次忘记改了。
1、测试不传账号密码
我们打开 postman 输入 post 请求 http://127.0.0.1:7001/api/user/register
,填写上请求参数,账号,跟密码不填写值,结果返回如下:
2、测试输入正常的账号密码
我们输入自己要注册的账号密码,比如输入 username :kaimo313,password:123456。点击发送:效果如下
显示注册成功之后,我们去本地数据库看看 user 表里是否有数据。
在 DBeaver 中,我们右击 user 表然后点击刷新:就能看到我们刚刚添加的数据
3、测试输入重复的账号
我们在第二步的基础上不改信息,继续点击发送,此时,kaimo313 这个账号已经在数据库里存在了,效果如下:
说明
这个只是实现了简单的注册功能,实际生产是不会这么简单的,可能会涉及到密码的加密传输,验证码的校验等等。