Sequential load error when including linked model

I am using Sequelize to fulfill this request:

return Expense.findAll({
     include: [{
       model: ExpenseCategory
     }],
   })
  .then(expenses => res.status(200).send(expenses))
  .catch(error => res.status(500).send({ error: error }));

      

and I am getting this error:

SequelizeEagerLoadingError

I cannot find my mistake.
These are my migrations for three models (User, Expense, ExpenseCategory):

queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      email: {
        allowNull: false,
        type: Sequelize.STRING,
        unique: true
      },
      passhash: {
        allowNull: false,
        type: Sequelize.STRING
      },
      currency: {
        type: Sequelize.STRING,
        defualt: 'lev'
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });



queryInterface.createTable('Expenses', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      value: {
        allowNull: false,
        type: Sequelize.FLOAT
      },
      text: {
        type: Sequelize.STRING
      },
      expenseCategoryId: {
        allowNull: false,
        type: Sequelize.INTEGER,
        references: {
          model: 'ExpenseCategories',
          key: 'id'
        },
        onDelete: 'cascade'
      },
      userId: {
        allowNull: false,
        type: Sequelize.INTEGER,
        references: {
          model: 'Users',
          key: 'id'
        },
        onDelete: 'cascade'
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });

queryInterface.createTable('ExpenseCategories', {
        id: {
          allowNull: false,
          autoIncrement: true,
          primaryKey: true,
          type: Sequelize.INTEGER
        },
        category: {
          allowNull: false,
          type: Sequelize.STRING
        },
        createdAt: {
          allowNull: false,
          type: Sequelize.DATE
        },
        updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
        }
      });

      

and model definitions:

  const User = sequelize.define('User', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    email: {
      allowNull: false,
      type: DataTypes.STRING,
      unique: true
    },
    passhash: {
      allowNull: false,
      type: DataTypes.STRING
    },
    currency: {
      type: DataTypes.STRING,
      defaultValue: 'lev'
    }
  }, {
    classMethods: {
      associate: function (models) {
        User.hasMany(models.Income, {
          foreignKey: 'userId',
        });
        User.hasMany(models.Expense, {
          foreignKey: 'userId',
        });
      }
    }
  });

const Expense = sequelize.define('Expense', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    value: {
      allowNull: false,
      type: DataTypes.FLOAT
    },
    text: {
      type: DataTypes.STRING
    },
    expenseCategoryId: {
      allowNull: false,
      type: DataTypes.INTEGER
    },
    userId: {
      allowNull: false,
      type: DataTypes.INTEGER
    }
  }, {
    classMethods: {
      associate: function (models) {
        Expense.belongsTo(models.User, {
          foreignKey: 'userId'
        });
        Expense.belongsTo(models.ExpenseCateogory, {
          foreignKey: 'expenseCateogoryId',
        });
      }
    }
  });

const ExpenseCategory = sequelize.define('ExpenseCategory', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    category: {
      allowNull: false,
      type: DataTypes.STRING
    }
  }, {
    classMethods: {
      associate: function (models) {
        ExpenseCateogory.hasMany(models.Expense, {
          foreignKey: 'expenseCategoryId'
        });
      }
    }
  });

      

+3


source to share


1 answer


Just change these sections

classMethods: {
    associate: function (models) {
        ExpenseCateogory.hasMany(models.Expense, {
            foreignKey: 'expenseCategoryId'
        });
    }
}

      

to

ExpenseCategory.associate = (models) => {
    ExpenseCategory.hasMany(models.style,{
        as:'expensecategories'
    });
}

      



so that the model is fully consistent with this structure, and other models also

const ExpenseCategory = sequelize.define('ExpenseCategory', {
    id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
    },
    category: {
        allowNull: false,
        type: DataTypes.STRING
    }
});
ExpenseCategory.associate = (models) => {
    ExpenseCategory.hasMany(models.style,{
        as:'expensecategories'
    });
}
return ExpenseCategory;

      

This is with a link to this youtube video https://www.youtube.com/watch?v=SaVxJrTRkrI and this example from github to continue with examples for associations for models https://github.com/sequelize/express-example/tree/ master / models

0


source







All Articles