model.hasMany 不是函数

model.hasMany is not a function

试图从 index.js 文件中的另一个 js 文件访问模型,但收到 call.hasMany 不是函数的错误。但是如果我把我所有的模型都放在索引文件中它工作 fine.But 当我试图从不同的 js 文件访问模型时它不起作用并且 returns 一个错误。

这是我的主索引文件

const {Sequelize} = require('sequelize');
const sequelize = new Sequelize('###############') // Example for postgres
const call = require("./models/call.model.js")
const session = require("./models/session.model.js")
const session_extra_data = require("./models/session_extra_data.model.js")
call.hasMany(session,{
    as: "sessions"
})
session.belongsTo(call,{
    foreignKey: "call_id",
    as: "call"  
})
session.hasMany(session_extra_data,{
    as: "sessionExtraData"
})
session_extra_data.belongsTo(session,{
    foreignKey: "session_id",
    as: "session"
})
call.findAll({
    limit: 5,   
    include: [{
        model: session,
        as: "sessions",
        indlude:[{
            model: session_extra_data,
            as: "sessionExtraData",
        }],
        required: false,
        nested: true,
        all: true
    }] 
    // include: [{
    //     all: true,
    //     nested: true
    // }]
}).then(data => {
    console.log("DATA", JSON.stringify(data));
})

这是我的通话模型

module.exports = (sequelize, DataTypes) => {

    const call = sequelize.define('call', {
        id: {
            type: Sequelize.BIGINT,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true, 
            field: 'id'
        },
        version: {
            allowNull: false,
            type: Sequelize.BIGINT,
            field: 'version'
        },
        startDate: {
            allowNull: false,
            type: Sequelize.DATE,
            field: 'start_date'
        }
        
    },{
        freezeTableName:true,
        timestamps: false
    });
}

您正在从不同的 js 文件中导出一个箭头函数,但您没有return在此函数中输入任何内容,因此从本质上讲,您无权访问在此箭头内创建的模型功能。您需要 return 函数中的模型:

module.exports = (sequelize, DataTypes) => {

    const call = sequelize.define(
        ....
    );
    return call;
}

然后在您的索引文件中调用此函数以获取模型 returned:

const call = require("./models/call.model.js")();
call.hasMany(...);

但我不明白你为什么要从 js 文件导出箭头函数,你已将文件命名为 call.model.js 所以我假设你想导出模型本身。正确的做法是:

const Call = sequelize.define('call', {
    id: {
        type: Sequelize.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true, 
        field: 'id'
    },
    version: {
        allowNull: false,
        type: Sequelize.BIGINT,
        field: 'version'
    },
    startDate: {
        allowNull: false,
        type: Sequelize.DATE,
        field: 'start_date'
    }
    
},{
    freezeTableName:true,
    timestamps: false
});

module.exports = Call;

现在您的索引文件应该可以正常工作了。