Sequelize 错误:在 Index.js 中未定义 defineCall

Posted

技术标签:

【中文标题】Sequelize 错误:在 Index.js 中未定义 defineCall【英文标题】:Sequelize error: defineCall not defined in Index.js 【发布时间】:2016-11-08 03:19:58 【问题描述】:

我一直收到此续集错误

/node_modules/sequelize/lib/sequelize.js:508
      this.importCache[path] = defineCall(this, DataTypes);
                           ^
    TypeError: defineCall is not a function
    at module.exports.Sequelize.import             (/node_modules/sequelize/lib/sequelize.js:508:32)
at   /models/Index.js:16:33
at Array.forEach (native)
at Object.<anonymous> (/Users/vincentporta/Desktop/RCB_Classwork/cesarcell/models/Index.js:15:4)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)

我已将范围缩小到下面我的Index.js 文件中的注释代码

"use strict";

var fs        = require("fs");
var path      = require("path");
var Sequelize = require("sequelize");
var config    = require(path.join(__dirname, '..', 'config',    'config.json'))[env];
var sequelize = new Sequelize(config.database, config.username,  config.password, config);
var db        = ;

fs
  .readdirSync(__dirname)
  .filter(function(file) 
    return (file.indexOf(".") !== 0) && (file !== "index.js");
  )

下面这段注释的代码破坏了它 //.forEach(function(file) // var model = sequelize.import(path.join(__dirname, file)); // db[model.name] = model; // );

Object.keys(db).forEach(function(modelName) 
  if ("associate" in db[modelName]) 
    db[modelName].associate(db);
  
);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

有谁知道为什么会出现这个错误?

【问题讨论】:

您使用的是哪个版本的 Sequelize? @rels Sequelize [节点:4.4.2,CLI:2.4.0,ORM:2.0.0-rc1,mysql:^2.10.2] 【参考方案1】:

就我而言,它缺少default

此代码导致错误:

@Table
export class User extends Model<User> 
  @Column
  userId!: number;

  @Column
  tenantId!: number;

类定义中的default 修复了它:

@Table
export default class User extends Model<User> 
  @Column
  userId!: number;

  @Column
  tenantId!: number;

【讨论】:

【参考方案2】:

如果您有循环导入,也会发生这种情况。

【讨论】:

【参考方案3】:

我刚才看到了一个类似的问题,问题是模型文件夹中的一个文件实际上不是数据库模型。确保您的模型文件夹仅包含数据库的模型。希望这会有所帮助!

【讨论】:

【参考方案4】:

这通常意味着您正在尝试导入非续集对象。如果您的索引文件的名称是Index.js,那么您需要在您的过滤函数中更改它(第一个字母是大写)

return (file.indexOf(".") !== 0) && (file !== "Index.js");

因为它区分大小写。还要检查您的导入文件夹中是否没有任何其他文件未定义 sequelize 模型。如果只是将它们添加到您的过滤器功能中。

【讨论】:

以上是关于Sequelize 错误:在 Index.js 中未定义 defineCall的主要内容,如果未能解决你的问题,请参考以下文章

javascript Sequelize:模型和关联index.js文件

避免 Sequelize 类的多个实例

Node.js ORM框架Sequelize搭建服务

在 Sequelize 中使用 .create(...) 方法时如何处理错误

@Types/Sequelize 错误 TS1086:无法在环境上下文中声明访问器

javascript 在Sequelize方法中模拟timeOut错误(在控制器中)