课程章节: 【构建用户身份系统】通用用户系统与小程序用户系统
课程讲师: 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()
课程收货
了解了加密小知识