0

My assoications are not working with sequelize + express. My models are working, however the associations do not work. I have tried chaning everything, to no success

index.js 
const { Sequelize, DataTypes } = require("sequelize");

require("dotenv").config();

const sequelize = new Sequelize(
  process.env.DB_NAME,
  process.env.DB_USERNAME,
  process.env.DB_PASSWORD,
  {
    host: "localhost",
    dialect: "postgres",
    operatorAliases: false,
    pool: { max: 5, min: 0, acquire: 30000, idle: 10000 },
  }
);

const db = {};

db.Sequelize = Sequelize;
db.sequelize = sequelize;

db.words = require("./wordModel.js")(sequelize, DataTypes);
db.lessons = require("./lessonModel.js")(sequelize, DataTypes);

module.exports = db;

lessonModel

const { v4: uuidv4 } = require("uuid");

module.exports = (sequelize, DataTypes) => {
  const Lesson = sequelize.define("Lesson", {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
      allowNull: false,
    },
    name: {
      type: DataTypes.STRING,
    },
    number: {
      type: DataTypes.INTEGER,
    },
  });

  Lesson.associate = function (models) {
    Lesson.hasMany(models.Word, {
      as: "Words",
      foreignKey: "lessonId",
    });
  };

  return Lesson;
};

wordModel

const { v4: uuidv4 } = require("uuid");

module.exports = (sequelize, DataTypes) => {
  const Word = sequelize.define("Word", {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
      allowNull: false,
    },
    english: {
      type: DataTypes.STRING,
    },
    portuguese: {
      type: DataTypes.STRING,
    },
    lastStudied: {
      type: DataTypes.DATE,
    },
    toBeStudiedDate: {
      type: DataTypes.DATE,
    },
    timesSeen: {
      type: DataTypes.INTEGER,
    },
    timesWrong: {
      type: DataTypes.INTEGER,
    },
    status: {
      type: DataTypes.STRING,
    },
    percentage: {
      type: DataTypes.INTEGER,
    },
    lastFiveArray: {
      type: DataTypes.ARRAY(DataTypes.STRING),
    },
    lastFivePercentage: {
      type: DataTypes.INTEGER,
    },
    image: {
      type: DataTypes.STRING,
    },
    sound: {
      type: DataTypes.STRING,
    },
    lessonId: {
      type: DataTypes.UUID,
    },
  });

  Word.associate = function (models) {
    Word.belongsTo(models.Lesson, { as: "Lesson", foreignKey: "lessonId" });
  };

  return Word;
};

app.js

var createError = require("http-errors");
var express = require("express");
var path = require("path");
var cookieParser = require("cookie-parser");
var logger = require("morgan");
require("dotenv").config();
const db = require("./models");

var indexRouter = require("./routes/index");
var usersRouter = require("./routes/users");
const wordsRouter = require("./routes/words");
const lessonsRouter = require("./routes/lessons");

var app = express();

db.sequelize
  .sync()
  .then(async () => {
    const lesson = await db.lessons.create({ name: "Example Lesson" });
    await lesson.save();

    const word = await db.words.create({
      english: "Hello",
      lessonId: lesson.id,
    });
    await word.save();

    console.log(word.Lesson);

    console.log("Synced db.");
  })
  .catch((err) => {
    console.log("Failed to sync db: " + err.message);
  });

// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "jade");

app.use(logger("dev"));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, "public")));

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/words", wordsRouter);
app.use("/lessons", lessonsRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render("error");
});

module.exports = app;

I get a variety of errors. I recently started trying to console.log(word.Lesson) or a variety of word.getLesson(). Depending on how I am trying to test the assoication, I get the following errors:

Failed to sync db: Word is not associated to Lesson!

When I try and console.log I get undefined.

Many Thanks

Lin Du
  • 88,126
  • 95
  • 281
  • 483
Oni
  • 11
  • 2

1 Answers1

0

You didn't call the associate method of all registered models in order to register all associations, please do it, for instance, in index.js. To get the idea how to do it properly you can look at my other answer here

Anatoly
  • 20,799
  • 3
  • 28
  • 42