在 Egg.js 中使用 sequelize 建立 Model 踩坑记

此次简单分享一个在学习过程当中一个踩坑爬坑的故事。html

原由是笔者在看一本讲 Egg 的书,可是书中介绍的方法可能由于时间的推移,在笔者跟着学习时已经没法实现正常功能了。书中说 egg-sequelize 的版本有问题,要使用自定义的 sequelize-cli。 书中手动建立了 rc, config 文件, 和 migration, model, seeder 目录。node

跳坑

结果到建立 model 的时候出了问题。bash

./node_modules/.bin/sequelize model:generate --name User
复制代码

可是我本身亲手敲的时候会报错,提示缺乏attributes参数app

此时个人第一反应是,是否是 cli 有更新,我看下用当前版本的 cli 应该怎么作。async

摸索

参考 cli 文档,我补全了attributes参数,并成功生成了 model 和 migration。 生成的 Model 大概这个样子:工具

"use strict";
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    "User",
    {
      username: DataTypes.STRING
    },
    {}
  );
  return User;
};
复制代码

因而运行的时候,就会报错学习

TypeError: sequelize.define is not a function
复制代码

由于此时的 sequelize,其实是 Egg 的 Application, app 上历来没定义过 defineui

爬坑

仔细翻阅插件 egg-sequelize 的 readme 发现线索this

Read the tutorials to see a full example.spa

可用的 Model 其实应该长这个样子:

// app/model/user.js

module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const User = app.model.define("user", {
    login: STRING,
    name: STRING(30),
    password: STRING(32),
    age: INTEGER,
    last_sign_in_at: DATE,
    created_at: DATE,
    updated_at: DATE
  });

  User.findByLogin = async function(login) {
    return await this.findOne({
      where: {
        login: login
      }
    });
  };

  // don't use arraw function
  User.prototype.logSignin = async function() {
    return await this.update({ last_sign_in_at: new Date() });
  };

  return User;
};
复制代码

而后按照官方的 tutorial 走下来发现,Migration 和 Model 是分开生成的,Model 手动建立。Migration 和 Model 中的内容部分重合。像这样:

// user migraition
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    const { INTEGER, DATE, STRING } = Sequelize;
    await queryInterface.createTable("users", {
      // 看这里看这里 <---------
      id: { type: INTEGER, primaryKey: true, autoIncrement: true },
      name: STRING(30),
      age: INTEGER,
      created_at: DATE,
      updated_at: DATE
    });
  },
  down: async queryInterface => {
    await queryInterface.dropTable("users");
  }
};
复制代码
// user model
"use strict";

module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const User = app.model.define("user", {
    // 看这里看这里 <---------
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    name: STRING(30),
    age: INTEGER,
    created_at: DATE,
    updated_at: DATE
  });

  return User;
};
复制代码

后续打算写个小工具,用 Migration 的内容自动生成 app.model.define 的参数

总结

回顾了一下踩坑经历,一开始的注意力全在 cli 那边,却忽视了 sequelize 的使用场景 egg,也就忽视了 egg-sequelize 的存在。因此正确的打开姿式是先在官方文档中找答案,读文档,读文档,读文档。

相关文章
相关标签/搜索