继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

萧萧啊
关注TA
已关注
手记 21
粉丝 1
获赞 0

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

课程讲师: 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()

课程收货

了解了加密小知识

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP