为了账号安全,请及时绑定邮箱和手机立即绑定

【金秋打卡】第6天 Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》

课程章节: 【构建用户身份系统】通用用户系统与小程序用户系统

课程讲师: 7七月

课程内容:

用户注册与Sequelize新增数据

model 操作数据库
api/v1/user.js

const User = require(models/user.js)

const v = await new RegisterValidator().validate(ctx)
const user = {
	email: v.get('body.email'),
	password: v.get('body.password2'),
	nickname: v.get('body.nickname')
}
try{
	const r = User.create(user) // 创建我一个 user 的表 返回 user 模型
}catch(error){
	throw new ParameterException('email不能重复')
}

models/user.js

// email 保证唯一性
email: {
	type: Sequelize.STRING(128),
	unique: true 
}

validators/validator.js

// 查询email是否唯一
async validateEmail(vals) {
	const email = await vals.body.email
	User.findOne({
	   where: {
			email
       }
    })
    // email如果存在
    if(user) {
		throw new Error('email已存在')
    }
}

把lin-validator.js 改成 第二版

盐与密码加密的小知识

password 绝对不能已明文的形式保存在数据库中, 必须加密

npm install jsonwebtoken

在 api/v1/user.js

const bcrypt = require('bcryptjs')

// 不是位数, 生成盐花费的成本  更高 安全性更高
const salt = bcrypt.genSaltSync(10) // 盐
// 如果两个用户密码相同, 加密后的密文不会相同 这就是盐的作用, 防止彩虹攻击
const pwd = bcrypt.hashSync(v.get('body.password2'),salt) // 加密
// 直接使用加密过后的密码

模型的 set 操作

models/user.js

password: {
	type: Sequelize.STRING,
	set(val){
      const salt = bcrypt.genSaltSync(10) // 盐
      const pwd = bcrypt.hashSync(val,salt) // 加密
      this.setDataValue('password',pwd) // model模型里的方法  可以访问 this
    }
}
在模型中实现对 password 的加密 就不需要在接口中实现啦
只要 password 进行赋值 就会调用set

Success 操作成功处理

在core/http-exception.js

class Success extends HttpException {
	constructor(msg, errorCode) {
		super()
		this.code = 201
		this.msg = msg || 'ok'
		this.errorCode = errorCode || 0
    }
}

在api/v1/user.js

throw new global.errs.Success()

课程收货

了解了加密小知识

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消