最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Sequelize Model Not Creating Table in MySQL Database (TypeError: Cannot read properties of undefined (reading &

programmeradmin3浏览0评论

I’m working on a Node.js project using Sequelize with MySQL. The database connection is established successfully, and sequelize.sync({ alter: true }) runs without errors, but my users table is not being created.

Additionally, I’m getting the following error when requiring my model:

TypeError: Cannot read properties of undefined (reading 'define')
at Object.<anonymous> (B:\Builds\React-Express\nakargo\server\config\models\user.models.js:4:29)
at Module._compile (node:internal/modules/cjs/loader:1546:14)
at Object..js (node:internal/modules/cjs/loader:1689:10)
at Module.load (node:internal/modules/cjs/loader:1318:32)
at Function._load (node:internal/modules/cjs/loader:1128:12)
at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:218:24)
at Module.require (node:internal/modules/cjs/loader:1340:12)
at require (node:internal/modules/helpers:141:16)
at Object.<anonymous> (B:\Builds\React-Express\nakargo\server\config\db\dbConnection.js:24:19)

Here’s my setup:

user.models.js file

const { Sequelize, DataTypes } = require("sequelize");
const { sequelize } = require("../db/dbConnection");

const userModel = sequelize.define(
  "User",
  {
    id: {
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true,
      },
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false,
    },
  },
  {
    tableName: "users", // ✅ Explicit table name
    timestamps: true,
  }
);

module.exports = userModel; // ✅ Ensure model is exported correctly

db/dbConnection.js file

const { Sequelize } = require("sequelize");
const {
  DATABASE_NAME,
  DATABASE_USER,
  DATABASE_PASSWORD,
  DATABASE_HOST,
  DATABASE_PORT,
} = require("../envExports");

const sequelize = new Sequelize(
  DATABASE_NAME,
  DATABASE_USER,
  DATABASE_PASSWORD,
  {
    host: DATABASE_HOST,
    port: DATABASE_PORT,
    dialect: "mysql",
    logging: console.log, 
  }
);


const userModel = require("../models/user.models"); 

// Function to test database connection
const initializeDB = async () => {
  try {
    await sequelize.authenticate();
    console.log("✅ Database connection established successfully.");

    await sequelize.sync({ alter: true }); 
    console.log("✅ All models were synchronized successfully.");
  } catch (error) {
    console.error("❌ Failed to connect to the database:", error.message);
    process.exit(1); // Exit on critical failure
  }
};

// Function to clean up the connection
const disconnectDB = async () => {
  try {
    await sequelize.close();
    console.log("✅ Database connection closed successfully.");
  } catch (error) {
    console.error(
      "❌ Error while closing the database connection:",
      error.message
    );
  }
};

module.exports = { sequelize, initializeDB, disconnectDB, userModel }; 

Issue:

  • sequelize.authenticate() works fine, and I see "✅ Database connection established successfully."
  • sequelize.sync({ alter: true }) runs without errors, and "✅ All models were synchronized successfully." appears in the logs.
  • However, the users table is not being created in MySQL. Running SHOW TABLES; in MySQL does not list users.
  • I have also tried sequelize.sync({ force: true }), but no table is created.

What I Have Tried:

  • Verified that MySQL is running and connected.
  • Checked Sequelize logs (logging: console.log)—no CREATE TABLE statement appears.
  • Restarted nodemon after every change.
  • Manually checked MySQL with SHOW TABLES;.
  • Tried explicitly calling userModel.sync({ force: true }).

Question:

  • Why is my Sequelize model not creating a table in MySQL, and how can I fix the TypeError: Cannot read properties of undefined (reading 'define') error?
  • Any insights would be greatly appreciated!

I’m working on a Node.js project using Sequelize with MySQL. The database connection is established successfully, and sequelize.sync({ alter: true }) runs without errors, but my users table is not being created.

Additionally, I’m getting the following error when requiring my model:

TypeError: Cannot read properties of undefined (reading 'define')
at Object.<anonymous> (B:\Builds\React-Express\nakargo\server\config\models\user.models.js:4:29)
at Module._compile (node:internal/modules/cjs/loader:1546:14)
at Object..js (node:internal/modules/cjs/loader:1689:10)
at Module.load (node:internal/modules/cjs/loader:1318:32)
at Function._load (node:internal/modules/cjs/loader:1128:12)
at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:218:24)
at Module.require (node:internal/modules/cjs/loader:1340:12)
at require (node:internal/modules/helpers:141:16)
at Object.<anonymous> (B:\Builds\React-Express\nakargo\server\config\db\dbConnection.js:24:19)

Here’s my setup:

user.models.js file

const { Sequelize, DataTypes } = require("sequelize");
const { sequelize } = require("../db/dbConnection");

const userModel = sequelize.define(
  "User",
  {
    id: {
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true,
      },
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false,
    },
  },
  {
    tableName: "users", // ✅ Explicit table name
    timestamps: true,
  }
);

module.exports = userModel; // ✅ Ensure model is exported correctly

db/dbConnection.js file

const { Sequelize } = require("sequelize");
const {
  DATABASE_NAME,
  DATABASE_USER,
  DATABASE_PASSWORD,
  DATABASE_HOST,
  DATABASE_PORT,
} = require("../envExports");

const sequelize = new Sequelize(
  DATABASE_NAME,
  DATABASE_USER,
  DATABASE_PASSWORD,
  {
    host: DATABASE_HOST,
    port: DATABASE_PORT,
    dialect: "mysql",
    logging: console.log, 
  }
);


const userModel = require("../models/user.models"); 

// Function to test database connection
const initializeDB = async () => {
  try {
    await sequelize.authenticate();
    console.log("✅ Database connection established successfully.");

    await sequelize.sync({ alter: true }); 
    console.log("✅ All models were synchronized successfully.");
  } catch (error) {
    console.error("❌ Failed to connect to the database:", error.message);
    process.exit(1); // Exit on critical failure
  }
};

// Function to clean up the connection
const disconnectDB = async () => {
  try {
    await sequelize.close();
    console.log("✅ Database connection closed successfully.");
  } catch (error) {
    console.error(
      "❌ Error while closing the database connection:",
      error.message
    );
  }
};

module.exports = { sequelize, initializeDB, disconnectDB, userModel }; 

Issue:

  • sequelize.authenticate() works fine, and I see "✅ Database connection established successfully."
  • sequelize.sync({ alter: true }) runs without errors, and "✅ All models were synchronized successfully." appears in the logs.
  • However, the users table is not being created in MySQL. Running SHOW TABLES; in MySQL does not list users.
  • I have also tried sequelize.sync({ force: true }), but no table is created.

What I Have Tried:

  • Verified that MySQL is running and connected.
  • Checked Sequelize logs (logging: console.log)—no CREATE TABLE statement appears.
  • Restarted nodemon after every change.
  • Manually checked MySQL with SHOW TABLES;.
  • Tried explicitly calling userModel.sync({ force: true }).

Question:

  • Why is my Sequelize model not creating a table in MySQL, and how can I fix the TypeError: Cannot read properties of undefined (reading 'define') error?
  • Any insights would be greatly appreciated!
Share Improve this question edited Feb 16 at 13:37 Shadow 34.3k10 gold badges64 silver badges74 bronze badges asked Feb 16 at 12:07 Marcocholla01Marcocholla01 33 bronze badges 1
  • I see that user model references the dbConnection and in turn dbConnection references the user model, so they interdepend on eachother which is strange.. I feel like that this is the cause of what you are experiencing.I would decouple the user model from the dbConnection and remove the require. Instead, you could just export the user object only and rewrite the dbConnection to use that. – Kai Commented Feb 16 at 13:27
Add a comment  | 

1 Answer 1

Reset to default 0

This is a case where 2 or more modules depend on each other by sharing program elements. For example, a module A imports from B and at same time, B imports from A. We can summarise the dependency like so (A -> B -> A).

The problem here, based on how module loading works is that Node.js while loading A will find B and while loading B, will discover B requires again module A. In other to avoid an infinite loop, Node.js will return an incompletely loaded module A in B which will result in undefined imports in module B.

A quick fix would be:

  • remove sequelize.define from user.model.js
  • only export its contents
  • use sequelize.define in dbConnection.js and pass the object data in it
  • tada: circular dependency is gone

In practice this would be something like:

user.models.js:

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

const userModel = {
  name: "User",
  data: {
    id: {
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true,
      },
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false,
    },
  },
  {
    tableName: "users", // ✅ Explicit table name
    timestamps: true,
  }
};

module.exports = userModel; // ✅ Ensure model is exported correctly

dbConnection.js:

const { Sequelize } = require("sequelize");
const {
  DATABASE_NAME,
  DATABASE_USER,
  DATABASE_PASSWORD,
  DATABASE_HOST,
  DATABASE_PORT,
} = require("../envExports");

const sequelize = new Sequelize(
  DATABASE_NAME,
  DATABASE_USER,
  DATABASE_PASSWORD,
  {
    host: DATABASE_HOST,
    port: DATABASE_PORT,
    dialect: "mysql",
    logging: console.log, 
  }
);


const userModel = require("../models/user.models"); 
const userTable = sequelize.define(userModel.name, userModel.data);

// Function to test database connection
const initializeDB = async () => {
  try {
    await sequelize.authenticate();
    console.log("✅ Database connection established successfully.");

    await sequelize.sync({ alter: true }); 
    console.log("✅ All models were synchronized successfully.");
  } catch (error) {
    console.error("❌ Failed to connect to the database:", error.message);
    process.exit(1); // Exit on critical failure
  }
};

// Function to clean up the connection
const disconnectDB = async () => {
  try {
    await sequelize.close();
    console.log("✅ Database connection closed successfully.");
  } catch (error) {
    console.error(
      "❌ Error while closing the database connection:",
      error.message
    );
  }
};

module.exports = { sequelize, initializeDB, disconnectDB, userTable }; 

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论