Currently I realize an API using Node Js 13 and the ORM Sequelize v5 and all this in ES6 (via type: module in package.json).
In this project there is a problem when I try to use associations.
I have three models which are associated: author.js, authorbook.js and book.js .
author.js:
import Sequelize from 'sequelize';
import AuthorBook from './authorbook.js';
import dotenv from 'dotenv';
dotenv.config();
const sequelize = new Sequelize(
process.env.DB_DATABASE, process.env.DB_USERNAME, process.env.DB_PASSWORD,{
host: process.env.DB_HOST,
dialect: 'mysql'
}
);
export default class Author extends Sequelize.Model {}
Author.init({
firstName: {
firstName: false,
type: Sequelize.STRING(100)
},
lastName: {
allowNull: false,
type: Sequelize.STRING(100)
}
}, { sequelize });
Author.hasMany(AuthorBook, {
onUpdate: 'CASCADE'
});
book.js:
import Sequelize from 'sequelize';
import AuthorBook from './authorbook.js';
import dotenv from 'dotenv';
dotenv.config();
const sequelize = new Sequelize(
process.env.DB_DATABASE, process.env.DB_USERNAME, process.env.DB_PASSWORD,{
host: process.env.DB_HOST,
dialect: 'mysql'
}
);
export default class Book extends Sequelize.Model {}
Book.init({
title: {
firstName: false,
type: Sequelize.STRING(100)
}
}, { sequelize });
Book.hasMany(AuthorBook, {
onUpdate: 'CASCADE'
});
authorbook.js:
import Sequelize from 'sequelize';
import Author from './author.js';
import Book from './book.js';
import dotenv from 'dotenv';
dotenv.config();
const sequelize = new Sequelize(
process.env.DB_DATABASE, process.env.DB_USERNAME, process.env.DB_PASSWORD,{
host: process.env.DB_HOST,
dialect: 'mysql'
}
);
export default class AuthorBook extends Sequelize.Model {}
AuthorBook.init({
authorId: {
type: Number,
allowNull: false
},
bookId: {
type: Number,
allowNull: false
},
}, { sequelize });
AuthorBook.belongsTo(Author, { foreignKey: 'authorId'});
AuthorBook.belongsTo(Book, { foreignKey: 'bookId'});
Here is the error I get when I run the cmd node src/server.js
:
(node:23142) ExperimentalWarning: The ESM module loader is experimental.
file:///Users/alexandre/Documents/project/server/src/db/models/.js:18
Author.hasMany(AuthorBook, {
^
ReferenceError: Cannot access 'AuthorBook' before initialization
at file:///Users/alexandre/Documents/project/server/src/db/models/author.js:38:22
at ModuleJob.run (internal/modules/esm/module_job.js:110:37)
at async Loader.import (internal/modules/esm/loader.js:176:24)
Someone can help me ?