sequelize.import 不是函数

Hot*_*pin 27 node.js sequelize.js

我是新来的表达。

我想导入文件进行续集并声明:

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

                             ^
Run Code Online (Sandbox Code Playgroud)

它返回以下类型错误

TypeError: sequelize.import is not a function
Run Code Online (Sandbox Code Playgroud)

然后,将代码编辑为

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

                                         ^
Run Code Online (Sandbox Code Playgroud)

然后错误是:

TypeError: require(...) is not a function
Run Code Online (Sandbox Code Playgroud)

我认为这是导入东西的错误....

这是我的整个文件代码:

const fs = require('fs');

const path = require('path');

const Sequelize = require('sequelize');

const config = require('../config/config');

const db = {}

var __dirname = path.resolve();


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))

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

        db[model.name] = model

    })


db.sequelize = sequelize
db.Sequelize = Sequelize

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

Dav*_*mer 71

该错误是由使用 sequelize 导入对象引起的。相反,您应该使用 Node 内置的 CommonJSrequire函数。所以改变你的这一行models/index.js

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

到:

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

如果您发现更容易,您也可以重新生成models目录并在没有旧的情况下读取您的模型index.js

mv models models.bak && sequelize init:models && mv models.bak/index.js models.bak/index.js.bak && mv models.bak/* models/ && rm models.bak
Run Code Online (Sandbox Code Playgroud)

如果您在全球安装了 sequelize-cli,那一个 liner 将解决您的问题。如果你不这样做,你可以使用这个:

npm i --save-dev sequelize-cli && mv models models.bak && npx sequelize init:models && mv models.bak/index.js models.bak/index.js.bak && mv models.bak/* models/ && rm models.bak
Run Code Online (Sandbox Code Playgroud)

您可能还需要更新您的配置文件夹。我使用 JavaScript 配置来注入 ENV,因此我必须添加以更改我的const config = require(...行以反映这一点。如果您使用了我的单行之一,那么您的旧models/index.js文件现在位于 index.js.bak 中,如果您需要从中获取任何自定义内容。

  • @GregoryBologna如果你的意思是你的启动脚本正在加载`esm`,如`"start": "node -r esm app.js"`,你需要从你的`package中删除`"type": "module"`。 json` 规范,你会没事的。这是因为指定模块类型意味着即使使用 esm,也不能在任何地方使用“require”。一旦删除,“esm”将适当地编译您的代码。 (3认同)
  • 知道哪个版本删除了这个吗?续集的人真的不在乎破坏已知的 api,不是吗?(叹) (2认同)
  • @ChrisH 我很确定它是版本 6 及更高版本,但我有一个模糊的记忆在版本 5 后期的某个地方看到过这个。 (2认同)
  • 它已从 v5 -> v6 中删除:[重构:删除sequelize.import helper #12175](https://github.com/sequelize/sequelize/pull/12175)。文档:[升级到 v6](https://sequelize.org/master/manual/upgrade-to-v6.html)。@DavidKamer 很抱歉,我不明白如何将 `sequelize.import()` 代码更改为 v6 工作代码...... (2认同)

Hou*_*oui 17

这可能会对其他人有所帮助,在版本中6.6.5它已被弃用,您应该将其替换为sequelize.define.


bih*_*ris 9

到目前为止,我能够通过将 package.json 中的 sequelize 模块版本降级到"sequelize": "^5.22.3",. 如果它也固定在你身边,请告诉我。

编辑:任何续集版本< 6.0.0都应该正常工作