eggjs 怎么实现用户注册功能?

Posted 凯小默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eggjs 怎么实现用户注册功能?相关的知识,希望对你有一定的参考价值。

实现注册接口

大致流程:

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 这个账号已经在数据库里存在了,效果如下:

说明

这个只是实现了简单的注册功能,实际生产是不会这么简单的,可能会涉及到密码的加密传输,验证码的校验等等。

【项目:kaimo-cost-server】代码地址

以上是关于eggjs 怎么实现用户注册功能?的主要内容,如果未能解决你的问题,请参考以下文章

eggjs 怎么实现上传图片(头像)接口功能?

eggjs 怎么实现获取用户信息接口?

eggjs 怎么实现更新用户信息接口去更新个性签名?

eggjs 怎么实现获取账单列表接口并且实现列表数据分页查询功能?

eggjs 怎么实现更新用户信息接口去更新上传头像信息?

eggjs 怎么使用 egg-jwt 实现 token 解析?