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