day16

160 阅读2分钟

数据库可视化工具

Sequelize

const { Sequelize, Model, DataTypes } = require('sequelize')
const sequelize = new Sequelize({
    dialect: 'mysql',
    host: 3306,
    username: 'root',
    password: '',
    database: 'test',
    timezone: '+08:00',
    pool: {
        max: 10,
        min: 0
    },
    logging: false
})

class User extends Model { }
User.init({
    id: {
        type: DataTypes.INTEGER({unsigned: true}), 
        primaryKey: true,
        autoIncrement: true,
        comment: '用户ID' 
    },
    username: {
        type: DataTypes.STRING(40),
        allowNull: false,
        comment: '用户名'
    },
    password: {
        type: DataTypes.CHAR(64),
        allowNull: false,
        comment: '用户密码'
    }
}, { sequelize: sequelize, tableName: 'user', modelName:'user'})

sequelize.sync().then(()=> {
    return User.create({
        username: 'sequelizeTest',
        password: '1'
    })
}).then((user)=> {
    console.log(user.toJSON())
}).catch(err => {
    console.log(err)
})

首先配置数据库的链接,然后用user来继承model 配置字段和模型选项

数据类型

sequelize 几乎支持所有数据库的类型

DataType.INTRGER({unsigned: true}) // 创建无符号整型
DataType.STRING(40)
DataType.STRING({length: 20, unsigned: true, zerofill: true})

模型定义

字段设置

User.init({
    username: DataType.STRING(40)
    id: {
        type : DataType.INTEGER(length: 10, unsigned: true,
        primaryKey: true,
        autoIncrement: true
    )}
})
生成的SQL语句
`username` varchar(40) Default null
`id` int(10) unsigned NOT null auto_increment,
primary key(id)

模型选项

HOOKS

生命周期顺序

hooks: {
        beforeSave: (user => {
            if(user.changed('password')) {
                // user.password = crypto.createHash('sha256').update(user.password).digest('hex')
                // user.password = 'aaaa'
                console.log(user, 'beforeSave')
            }
        })
    }


User.findByPk(1).then((user) => {
user.password = 'password'
return user.save()
})

定义hooks的方式

User.init(properties, {
    hooks: {
        ///
    }
})
User.beforeSave(user => {
   //..
})
User.addHook('beforeSave', (user, options)=> {

})
addHook接受的生命周期名称是字符串,如果编码错误将不能匹配到对应声明周期中,因此建议使用

模型验证器

Sequelize内部自动处理的,也可以添加自定义检验

User.init({
    email: {
        type: DataType.STRING(40)
        validate: {
            isEmail: true,
            // 自定义检验方法
            isQQmail: function(value) {
                // ..
            }
        }, 
        allowNull: true
    }
})

异步验证 有些场景下执行自定义验证是需要异步的,比如说访问数据库或者HTTP接口,要是用async/await

status: {
    allNull: false,
    validate: {
        async remoteValidate(value) {
            // httprequest  是返回promise的接口
            let result = await httprequest(value)
            if (result.errcode) {
                throw new Error('states validate fail')
            }
        }
    }
}

如果设置了allowNull:fasle, 则优先判断null 如果是null跳过其他验证直接抛出错误

自定义验证

isEmail : {
    msg: '邮箱格式错误'
}
is: {
    msg: '手机号错误',
    args: /^1[3-9]\d{9}$/
}