Koa中使用Sequelize操作数据库

  • 第一步:安装koa、koa-router、sequelize、mysql2,mysql2是mysql的驱动包,如果使用的是其他的数据库,就改用其他数据库的驱动包

    package.json中依赖的版本:

    "dependencies": {
        "bcryptjs": "^2.4.3",
        "koa": "^2.7.0",
        "koa-router": "^7.4.0",
        "mysql2": "^1.6.5",
        "sequelize": "^5.6.1"
      }
    

    bcryptjs是密码操作工具包,用于对密码进行加密操作

  • 创建数据库连接

    // 文件名:core/db.js
    const Sequelize = require("sequelize");
    
    // 使用sequelize操作数据库,必须导入数据库依赖包,这里导的是mysql2
    const sequelize = new Sequelize(数据库名, 用户名, 密码, {
        dialect: 数据库类型,这里是mysql,
        host: 主机号,这里是localhost,
        port: 端口号,这里是3306,
        logging: true, // 是否显示SQL语句
        timezone: "+08:00", // 时区,如果没有设置,会导致数据库中的时间字段与中国时区时间相差8小时
        define: {
            timestamps: true, // 是否自动创建时间字段, 默认会自动创建createdAt、updatedAt
            paranoid: true, // 是否自动创建deletedAt字段
            createdAt: "create_time", // 重命名字段
            updatedAt: "update_time",
            deletedAt: "delete_time",
            underscored: true // 开启下划线命名方式,默认是驼峰命名
        }
    });
    
    sequelize.sync({
        force: false // 每次启动都重新自动创建表
    });
    
    module.exports = {
        sequelize
    }
    
  • 创建数据表对应的模型对象

    // 文件名:models/user.js
    const {Sequelize, Model} = require("sequelize")
    const bcryptjs = require("bcryptjs");
    const {sequelize} = require("../core/db");
    
    class User extends Model {
    
    }
    
    User.init({
        id: {
            type: Sequelize.INTEGER(11),
            autoIncrement: true, // 自动增长
            primaryKey: true // 主键字段
        },
        nickname: Sequelize.STRING(128),
        password: {
            type: Sequelize.STRING(512),
            // 对密码进行加密,监听属性,使用了观察者模式,当password属性值被改变时,就执行下面的操作,观察者模式在vue中使用的很多
            set(val) {
                const salt = bcryptjs.genSaltSync(10);
                const pwd = bcryptjs.hashSync(val, salt);
                // 将password属性的属性值设置为pwd
                this.setDataValue("password", pwd);
            }
        },
        email: {
            type: Sequelize.STRING(128),
            unique: true
        },
        openid: {
            type: Sequelize.STRING(128),
            unique: true
        }
    }, {
        sequelize,
        tableName: "user" // 如果不设置tableName,自动生成的数据库中的user表的表名为Users
    })
    
    module.exports = {
        User
    }
    
  • 使用User模型向数据库添加记录

    // 文件名:api/user.js
    const Router = require("koa-router");
    const router = new Router({
        prefix: "/v1/user" // 设置路由前缀
    });
    const {User} = require("../../../models/user")
    
    // 访问地址:http://localhost:8080/v1/user/register
    router.post("/register", async (ctx, next) => {
        // 将数据保存到数据库
        User.create({
            nickname: v.get("body.nickname"),
            email: v.get("body.email"),
            password: v.get("body.password")
        });
    })
    
    module.exports = router;
    
  • 在sequelize中使用事务

    const {Sequelize, Model} = require("sequelize");
    const {sequelize} = require("../core/db");
    const {Art} = require("../service/art");
    
    class Favor extends Model {
    
        static async like(uid, artId, type) {
    
            // 在sequelize中使用事务
            await sequelize.transaction(async (t) =>{
                const favor  = await Favor.findOne({
                    where: {
                        uid,
                        artId,
                        type
                    }
                });
                if(favor) {
                    throw new global.errors.LikeError();
                }
    
                // 添加一条点赞记录
                await Favor.create({
                    uid,
                    artId,
                    type
                }, {transaction: t});
    
                const art = await Art.getClassicData(artId, type);
                // art中的点赞数加一
                await art.increment("favNums", {by: 1, transaction: t});
            })
        }
    }
    
    Favor.init({
        uid: Sequelize.INTEGER,
        artId: Sequelize.INTEGER,
        type: Sequelize.INTEGER
    }, {
        sequelize,
        tableName: "favor"
    });
    
    module.exports = {
        Favor
    }
    

你可能感兴趣的:(koa)