'Sequelize belongsTo query results in belongsTo called with something that's not a subclass of Sequelize.Model error


I am trying to write a join query using belongsTo but getting error:

Error: LearningCertificateEvent.belongsTo called with something that's not a subclass of Sequelize.Model at Function. (/Users/msmexmac/node/msmex-backend/msmex-api/node_modules/sequelize/lib/associations/mixin.js:93:13)

I am trying to fetch events related to learning cerfificate events. I tried every thing but it does not work somehow.

My models are as follows:

LearningCertificate Model

"use strict";

const Sequelize = require("sequelize");
const sequelize = require("../helpers/db");
const LearningCertificateEvent = require("./LearningCertificateEvent");

const LearningCertificate = sequelize.define(
  "LearningCertificate",
  {
    id: {
      autoIncrement: true,
      type: Sequelize.BIGINT,
      primaryKey: true,
    },
    userId: {
      type: Sequelize.INTEGER,
      field: "user_id",
    },
    certificateURL: {
      type: Sequelize.STRING,
      field: "certificate_url",
    },
    certificatePNGURL: {
      type: Sequelize.STRING,
      field: "certificate_png_url",
    },
    certificateType: {
      type: Sequelize.STRING,
      field: "certificate_type",
    },
    createdAt: {
      type: Sequelize.BIGINT,
      field: "created_at",
    },
    updatedAt: {
      type: Sequelize.BIGINT,
      field: "updated_at",
    },
  },
  {
    timestamps: false,
    tableName: "learning_certificate",
  }
);

LearningCertificate.hasMany(LearningCertificateEvent, {
  foreignKey: "certificateId",
});

module.exports = LearningCertificate;

The second model is : LearningCertificateEvent Model

"use strict";

const Sequelize = require("sequelize");
const sequelize = require("../helpers/db");
const MsmexEvent = require("./MsmexEvent");

const LearningCertificateEvent = sequelize.define(
  "LearningCertificateEvent",
  {
    id: {
      autoIncrement: true,
      type: Sequelize.BIGINT,
      primaryKey: true,
    },
    userId: {
      type: Sequelize.INTEGER,
      field: "user_id",
    },
    certificateId: {
      type: Sequelize.INTEGER,
      field: "certificate_id",
    },
    eventId: {
      type: Sequelize.INTEGER,
      field: "event_id",
    },
    createdAt: {
      type: Sequelize.BIGINT,
      field: "created_at",
    },
    updatedAt: {
      type: Sequelize.BIGINT,
      field: "updated_at",
    },
  },
  {
    timestamps: false,
    tableName: "learning_certificate_event",
  }
);

LearningCertificateEvent.belongsTo(MsmexEvent, {
  foreignKey: "eventId",
});

// MsmexEvent.hasMany(LearningCertificateEvent, {
//   foreignKey: "eventId",
// });

module.exports = LearningCertificateEvent;

And last model is: MsmexEvent Model

"use strict";

const Sequelize = require("sequelize");
const sequelize = require("../helpers/db");
const LearningCertificateEvent = require("./LearningCertificateEvent");

const Event = sequelize.define(
  "Event",
  {
    id: {
      autoIncrement: true,
      type: Sequelize.BIGINT,
      primaryKey: true,
    },
    identifier: {
      type: Sequelize.STRING,
      field: "identifier",
    },
    expertId: {
      type: Sequelize.INTEGER,
      field: "expert_id",
    },
    waitList: {
      type: Sequelize.BOOLEAN,
      field: "waitList",
    },
  },
  {
    timestamps: false,
    tableName: "msmex_event",
  }
);

module.exports = Event;

The query which I have written is as follows:

return LearningCertificate.findAll({
    where: {
      userId: userId,
    },
    include: [
      {
        model: LearningCertificateEvent,
        required: true,
        include: [
          {
            model: MsmexEvent,
            required: true,
          },
        ],
      },
    ],
    order: [["id", "DESC"]],
  });

In query however if I replace MsmexEvent with some other table for example User it works fine.

Can some one please help ?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source