sequelize.import 出错:defineCall 不是函数

Bre*_*dan 5 node.js npm express sequelize.js

我得到的错误是这样的:

C:\Users\brend\project\server\node_modules\sequelize\lib\sequelize.js:392
      this.importCache[path] = defineCall(this, DataTypes);
                               ^
TypeError: defineCall is not a function
    at Sequelize.import (C:\Users\brend\project\server\node_modules\sequelize\lib\sequelize.js:392:32)
    at fs.readdirSync.filter.forEach (C:\Users\brend\project\server\src\models\index.js:20:35)
Run Code Online (Sandbox Code Playgroud)

我正在学习 node、vue 和一堆库,但我一直无法弄清楚这一点。

index.js 如下:

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')
const db = {}

const sequelize = new Sequelize(
  config.db.database,
  config.db.user,
  config.db.password,
  config.db.options
)

fs
  .readdirSync(__dirname)
  .filter((file) =>
    file !== 'index.js'
  )
  .forEach((file) => {
    const model = sequelize.import(path.join(__dirname), file)
    db[model.name] = model
  })

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db
Run Code Online (Sandbox Code Playgroud)

这是我的 User.js,这是我目前拥有的唯一模型:

module.exports = (sequelize, DataTypes) =>
  sequelize.define('User', {
    email: {
      type: DataTypes.STRING,
      unique: true
    },
    password: DataTypes.STRING
  })
Run Code Online (Sandbox Code Playgroud)

如有必要,我的文件夹结构:

-src
--app.js
--routes.js

--config
----config.js

--controllers
----AuthenticationController.js

--models
----index.js
----User.js
Run Code Online (Sandbox Code Playgroud)

还有一点是在我的 app.jssequelize.sync()中没有定义,至少我的 IDE 是这样表示的。

art*_*est 13

我在 github sequelize github上找到了这个,替换

const model = sequelize.import(path.join(__dirname, file));
Run Code Online (Sandbox Code Playgroud)

var model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
Run Code Online (Sandbox Code Playgroud)

它适用于 sequelize 6.3.0


Abh*_*hah 12

sequelize.import 在 sequelize v6+ 中已被弃用。它一直存在到 v5

https://sequelize.org/master/manual/upgrade-to-v6.html#sequelize https://sequelize.org/master/manual/models-definition.html

之前的models/index.js工作直到续集v5

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')
const db = {}

const sequelize = new Sequelize(
  config.db.database,
  config.db.user,
  config.db.password,
  config.db.options
)

fs
  .readdirSync(__dirname)
  .filter((file) =>
    file !== 'index.js'
  )
  .forEach((file) => {
    const model = sequelize.import(path.join(__dirname), file) // error occurs here
    db[model.name] = model
  })

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db
Run Code Online (Sandbox Code Playgroud)

现在 sequelize v6+ 以后sequelize.import将不可用。

所以在 forEach 部分进行以下更改 models/index.js

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')
const db = {}

const sequelize = new Sequelize(
  config.db.database,
  config.db.user,
  config.db.password,
  config.db.options
)

fs
  .readdirSync(__dirname)
  .filter((file) =>
    file !== 'index.js'
  )
  .forEach((file) => {
    //-----------------------THIS PART HERE-----------------------
    /**
     * Choose any one of the below definition for model variable 
     */
    // for individual model files having `export default (sequelize, DataTypes) => {`    
    const model = require(path.join(__dirname, file)).default(sequelize, Sequelize.DataTypes); 
    // for individual model files having `module.exports = (sequelize, DataTypes) => {`    
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);

    db[model.name] = model;
    //----------------------------------------------------------
  })

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 如果export default ...在模型文件和 babel 中使用 -> 我们正在使用require(...).default

  • asrequire(...)不返回函数而是返回一个对象作为 :{ default: [Function] }并因此使用它的属性“默认”


ald*_*tis 0

尝试:

模型/index.js:

...

fs
    .readdirSync(__dirname)
    .filter((file) => {
        return (file.indexOf(".") !== 0) && (file !== "index.js");
    })
    .forEach((file) => {
        const model = sequelize.import(path.join(__dirname, file));
        db[model.name] = model;
    });

    Object.keys(db).forEach((modelName) => {
        if (db[modelName].associate) {
            db[modelName].associate(db);
        }
    });
...
Run Code Online (Sandbox Code Playgroud)

models/user.js:(我用小写)

module.exports = (sequelize, Sequelize) => {
  var User = sequelize.define('user', {
    email: {
      type: Sequelize.STRING,
      unique: true
    },
    password: Sequelize.STRING
  })

  return User;
}
Run Code Online (Sandbox Code Playgroud)

调用model.user:

const model = require('./models'); // Change path if is necesary
model.user.create({ ...
Run Code Online (Sandbox Code Playgroud)

  • 类型错误:sequelize.import 不是函数 (2认同)