Search code examples
mysqlnode.jsormsequelize.js

Unable to create association with Sequelize


I'm using sequelize for my project and trying to create a simple association between two models.

User model:

const { DataTypes } = require('sequelize');
import db from '../db';

const UserModel = db.define('user', {
  id: {
    type: DataTypes.STRING,
    unique: true,
    primaryKey: true,
    allowNull: false
  },
  email: {
    type: DataTypes.STRING,
    allowNull: true,
    unique: true
  },
  ...
});

export default UserModel;

Session model

const { DataTypes } = require('sequelize');
import db from '../db';

const SessionModel = db.define('session', {
  id: {
    type: DataTypes.STRING,
    unique: true,
    allowNull: false,
    primaryKey: true
  },
  userId: {
    type: DataTypes.STRING,
    allowNull: false,
    references: {
      model: 'users',
      key: 'id'
    }
  },
  expiresAt: {
    type: DataTypes.DATE,
    allowNull: false
  }
});

export default SessionModel;

I have a script for migration, and here is how i define association

require('dotenv').config({ path: '../.env' });
const { DataTypes } = require('sequelize');

import db from '../db';

// Models
import SessionModel from '../models/session';
import UserModel from '../models/user';

/**
 * Associations.
 */

// Session - User association
UserModel.hasMany(SessionModel, { foreignKey: 'userId', type: DataTypes.STRING });
SessionModel.belongsTo(UserModel, { foreignKey: 'userId', type: DataTypes.STRING });

/**
 * Sync the database.
 */
const start = async () => {
  await db.sync({ force: true });
};

if (process.env.START && require.main === module) {
  start()
    .then(() => {
      console.info('DONE ✨');
    })
    .catch((err) => {
      console.error('ERROR 💥', err);
    });
}

Then I try to retrieve user data with session like this

const users = await UserModel.findAll({
    where: whereCondition,
    include: [SessionModel]
  });

The error message is "session is not associated to user!"

Sequelize version is

"sequelize": "^6.35.1"

Solution

  • Your associations seem to be setup correctly and the issue might be coming from the way you are referencing your models, specifically in the code below:

      userId: {
        type: DataTypes.STRING,
        allowNull: false,
        references: {
          **model: 'users'**, <------ this should be referenced as user
          key: 'id'
        }
      },