课程名称:Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》
课程章节:第6章 【构建用户身份系统】通用用户系统与小程序用户系统
视频:6-2 中间件只在应用程序启动时初始化一次
6-3 盐与密码加密的小知识
6-4 模型的set操作
课程讲师: 七月
课程内容:
6-2 中间件只在应用程序启动时初始化一次
中间件是静态的方式。目前的情况是把校验器编写成为一个类。每一次都是实例化这个类,如果有十个请求,会实例化十次。如果用中间件的形式编写,仅仅会在Koa项目启动的时候new一次,并不会每一次请求都启动。这样全局只有一个validator,会造成数据错乱。目前的方式,每个validator互相不会干扰。
结论就是,在中间件的地方,不要轻易的用类的形式注册中间件。 如果是函数,就不会出现这个问题。
6-3 盐与密码加密的小知识
密码用明文的方式存储在数据库中,不安全。必须进行加密处理。可以借助第三方的库实现。
const bcrypt = require('bcryptjs')
const Router = require('koa-router')
const { RegisterValidator } = require('../../validator/validator')
const { User } = require('../../models/user')
const router = new Router({
prefix: '/v1/user'
})
//注册
router.post('/register', async (ctx) => {
//接收参数->校验参数
console.log(ctx)
const v = new RegisterValidator().validate(ctx)
const salt = bcrypt.genSaltSync(10) //10表示生成‘盐’的成本, 生成盐的成本越高,安全性越高。
const psw = bcrypt.hashSync(v.get('body.password1'), salt)
//目前的情况是 初始密码相同,盐不同,加密之后的密码也不同。 可以抵御彩虹攻击
console.log(v)
const user = {
email: v.get('body.email'),
password: psw,
nickname: v.get('body.nickname')
}
const r = await User.create(user)
})
module.exports = router6-4 模型的set操作
这里的set操作,和ThinkPHP中的修改器是相同的设计,很好理解。以下代码演示了set操作。
const bcrypt = require('bcryptjs')
const { sequelize } = require('../../core/db')
const { Sequelize, Model } = require('sequelize')
class User extends Model {
}
User.init({
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
nickname: Sequelize.STRING,
email: {
type: Sequelize.STRING(128),
unique: true
},
password: {
type: Sequelize.STRING,
set(val) {
const salt = bcrypt.genSaltSync(10) //10表示生成‘盐’的成本, 生成盐的成本越高,安全性越高。
const psw = bcrypt.hashSync(v.get('body.password1'), salt)
this.setDataValue('password', psw)
}
},
openid: {
type: Sequelize.STRING(64),
unique: true
},
test: Sequelize.STRING
}, {
sequelize,
tableName: 'user'
})
module.exports = {
User
}课程收获:
这两节课讲了密码在数据库中不能用明文存储,以及如何给密码加盐,因为这是web编程的最基础知识。且在其他的项目中用其他的语言已经这么做了。所以这里的逻辑,理解的很清楚透彻。讲set操作的时候,set和ThinkPHP中的修改器是一个道理。理解起来也很容易。
七月老师非常注重在讲编程知识的同时,讲编程思维,讲知识和知识之间的关系。编程是实践性非常强的工作,学习知识最好的方法是放到项目中。做项目的目的不是做项目,最终要做出来自己的项目,业务承载的是编程知识。明天继续刷后边的课程。


随时随地看视频