【问题标题】:No Sequelize instance passed没有通过 Sequelize 实例
【发布时间】:2019-09-10 12:29:41
【问题描述】:

我正在尝试将我的模型从我的 dbController 外包给 dbInit 函数,因为我有几个模型可以使 dbController 变大。

所以我从我的db_controller.js 调用initDb,看起来像这样(我使用那个文档http://docs.sequelizejs.com/manual/getting-started.html

const userModel = require('../model/user')
const subjectModel = require('../model/subject')
const Sequelize = require('sequelize')
const seq = new Sequelize({
  dialect: 'sqlite',
  storage: './user.db'
})

async function initDb () {
  await userModel.user.initUser()
  await subjectModel.subject.initSubject()
  userModel.user.userClass.hasMany(subjectModel.subject.subjectClass)
}

user.js 中的用户如下所示:

const Sequelize = require('sequelize')
const seq = new Sequelize({
  dialect: 'sqlite',
  storage: './user.db'
})

class User extends Sequelize.Model {
}

exports.user = {
  initUser: initUser,
  userClass: User
}

async function initUser () {
  return new Promise(resolve => {
    User.init(
      // attributes
      {
        firstName: {
          type: Sequelize.STRING,
          allowNull: false
        },
        lastName: {
          type: Sequelize.STRING,
          allowNull: false
        },
        email: {
          type: Sequelize.STRING,
          allowNull: false
        }
      },
      // options
      {
        seq,
        modelName: 'user'
      }
    )
    resolve()
  })
}

subject.js 几乎相同

const Sequelize = require('sequelize')
const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: './user.db'
})

class Subject extends Sequelize.Model {
}

exports.subject = {
  initSubject: initSubject,
  subjectClass: Subject
}

async function initSubject () {
  return new Promise(resolve => {
    Subject.init(
      // attributes
      {
        name: {
          type: Sequelize.STRING,
          allowNull: false
        }
      },
      // options
      {
        seq: sequelize,
        modelName: 'subject'
      }
    )
    resolve()
  })
}

所以当我尝试通过node db_controller.js执行此操作时

我收到此错误(缩短)

(node:12444) UnhandledPromiseRejectionWarning: Error: No Sequelize instance passed
    at Function.init (D:\Git\ppb\node_modules\sequelize\lib\model.js:915:13)
    at resolve (D:\Git\ppb\src\model\user.js:26:10)
    at new Promise (<anonymous>)
    at Object.initUser (D:\Git\ppb\src\model\user.js:25:10)
    at initDb (D:\Git\ppb\src\controller\db_controller.js:18:24)
    at Object.<anonymous> (D:\Git\ppb\src\controller\db_controller.js:45:1)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)

非常感谢您提前提供任何建议!

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    我认为您在选项中传递 seq 而不是 sequelize 很奇怪。

    在这里查看文档http://docs.sequelizejs.com/ 我在示例中看到他们传递了属性sequelize 而不是seq

    所以我建议改变:

    {
      seq: sequelize,
      modelName: 'subject'
    }
    

    {
      sequelize: sequelize,
      modelName: 'subject'
    }
    

    【讨论】:

    • 哦!我重命名了它,显然当时有些事情搞砸了。谢谢 :) 顺便说一句,解决方案就是:sequelize, modelName: 'subject
    • const seq = sequelize; 是否只是为了清楚起见?
    【解决方案2】:
    import database from 'path/some*.ts';
    

    这是我在 express app.ts 中使用时的初始化数据库文件;我也在这个数据库文件中导出了 sequelize 实例;

    import User from '../some/model/define/file';
    

    导入Sequelize的数据库后可以自动同步定义到schema,模型如下:

    Class User extends Model {...} 
    User.define(...);
    User.has or many();
    

    这样可以解决问题:sequelize instance error。

    point:在你的 sequelize 参考顺序后面!!!!

    【讨论】:

      猜你喜欢
      • 2021-06-15
      • 2022-01-02
      • 1970-01-01
      • 2019-04-04
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多