【问题标题】:Error on sequelize.import: defineCall is not a functionsequelize.import 上的错误:defineCall 不是函数
【发布时间】:2018-04-15 07:08:36
【问题描述】:

我得到的错误是:

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)

我正在学习 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

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

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

如果需要,我的文件夹结构:

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

--config
----config.js

--controllers
----AuthenticationController.js

--models
----index.js
----User.js

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

【问题讨论】:

    标签: node.js express npm sequelize.js


    【解决方案1】:

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

    const model = sequelize.import(path.join(__dirname, file));
    

    var model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    

    它适用于我的续集 6.3.0

    【讨论】:

      【解决方案2】:

      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
      

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

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

      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
      

      注意事项:

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

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

      【讨论】:

        【解决方案3】:

        “sequelize.import”已被弃用。你应该改用“require”。

        参见上面的 artfulbeest 解决方案。它对我有用。

        进一步阅读请转到官方文档 (https://sequelize.org/master/manual/models-definition.html)

        【讨论】:

          【解决方案4】:

          检查您正在使用的 sequelize 版本。当我使用sequelize@6.0.0-beta.6 并发现import 从续集对象/客户端中丢失时,我遇到了一个持续错误:

          npm 卸载续集

          npm 安装续集

          【讨论】:

            【解决方案5】:

            这里是关于sequelize的解决方案": "^6.3.4 替换

            const model = sequelize.import(path.join(__dirname, file));
            

            const model = require(path.join(__dirname, file))(sequelize, Sequelize);
            

            【讨论】:

              【解决方案6】:

              试试:

              models/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);
                      }
                  });
              ...
              

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

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

              调用model.user:

              const model = require('./models'); // Change path if is necesary
              model.user.create({ ...
              

              【讨论】:

              • TypeError: sequelize.import 不是函数
              猜你喜欢
              • 2018-09-09
              • 2020-10-18
              • 2021-07-07
              • 1970-01-01
              • 2021-08-21
              • 2020-11-13
              • 2020-11-06
              • 2016-11-08
              • 2018-11-11
              相关资源
              最近更新 更多