类型错误:defineCall 不是函数。要求()失败

Posted

技术标签:

【中文标题】类型错误:defineCall 不是函数。要求()失败【英文标题】:TypeError: defineCall is not a function. require() fails 【发布时间】:2021-07-07 18:03:46 【问题描述】:

我最近加入了一个使用 Sequelize 构建数据库模型的项目。但是,在获得TypeError: defineCall is not a function 之前,我无法使用 sequelize.import 导入多个文件。使用 require() 导入某些文件的默认功能似乎有错误。我有以下结构:

models/index.ts

import fs from 'fs';
import path from 'path';
import Sequelize from 'sequelize';

const sequelize = new Sequelize('mysql://root:password@localhost/myDatabase', 
    dialect: 'mysql',
    logging: false
);

const db: any = ;

fs.readdirSync(__dirname).filter(file => 
    return (file.indexOf('.') !== 0) && (file !== 'index.ts') && (file.endsWith('.js'));
).forEach(file => 
    const model = sequelize.import(path.join(__dirname, file)); //<<<<<<<<<< This brings an error
    db[model.name.charAt(0).toUpperCase() + model.name.slice(1)] = model;
);

以及失败的地方:

sequelize.js

  import(path) 
    // is it a relative path?
    if (Path.normalize(path) !== Path.resolve(path)) 
      // make path relative to the caller
      const callerFilename = Utils.stack()[1].getFileName();
      const callerPath = Path.dirname(callerFilename);
      path = Path.resolve(callerPath, path);
    

    if (!this.importCache[path]) 
      let defineCall = arguments.length > 1 ? arguments[1] : require(path);

      if (typeof defineCall === 'object') 
        // ES6 module compatability
        defineCall = defineCall.default;
      

      this.importCache[path] = defineCall(this, DataTypes);// <<<<<<<< defineCall is undefined here
    

    return this.importCache[path];
  

导致未定义 defineCall 的典型文件:

models/action-calls.js

export default function(sequelize, DataTypes) 
    return sequelize.define('actionCalls', 
        id:  type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false ,
        actionId:  type: DataTypes.INTEGER, allowNull: false ,
        userId:  type: DataTypes.INTEGER, allowNull: false ,
        date:  type: DataTypes.DATE, allowNull: false ,
        number:  type: DataTypes.STRING(32), allowNull: false ,
        duration:  type: DataTypes.INTEGER 
    , 
        tableName: 'ActionCalls',
        timestamps: false
    );

奇怪的是,有时这个文件被导入没有问题,但另一个文件最终得到错误。我查看了 models/ 文件夹中的所有文件,它们都遵循与 action-calls.js 相同的模式。直到上周它首次出现时,我才对此没有任何问题。我的同事没有遇到相同代码库的错误。我尝试回到以前可以工作的较早提交,但现在错误仍然存​​在。任何帮助将不胜感激。

【问题讨论】:

sequelize.js 的第一行有语法错误。我不知道你是在尝试使用函数还是实际导入模块。 import是sequelize.js中的一个函数 我觉得很奇怪,因为import 是一个保留关键字(意味着它不能用于命名事物),即使它是一个函数,也不是定义函数的语法,也不是调用它的语法。您可以链接到文档或显示更多代码吗? 我们使用的是旧版本的 Sequelize。较新版本中不推荐使用导入功能。 sequelize.org/master/manual/models-definition.html 【参考方案1】:

原来问题出在 ts-node-dev 上。从 1.0.0-pre.49 更新到 1.1.6 后,错误消失了。

【讨论】:

以上是关于类型错误:defineCall 不是函数。要求()失败的主要内容,如果未能解决你的问题,请参考以下文章

appcan.slider.js探索

FutureBuilder 错误:返回类型“对象?”不是闭包上下文所要求的“小部件”

类型错误:todo 不是函数

类型错误:opendirSync 不是函数

错误类型错误:_co.deleteConsulta 不是函数

类型错误:hbs 不是函数