首页 > 解决方案 > 无法让 Sequelize belongsToMany 关联工作 (EagerLoadingError)

问题描述

我是 Sequelize 的新手,并试图在 Cubicles 和用户之间建立多对多的关系。我有一个预订表来加入这两个表。

目前我正在使用 sequelize.define 方法来创建模型。我不确定在哪里创建关联,我在模型文件中制作它们时出错(错误是说其他模型不存在)。我把它们放在 backend/server.js 文件中。

问题是当我尝试在预订中包含用户的信息时,它会产生一个错误,指出用户没有与预订相关联。

这是代码...

routes/reservations.js 的问题部分

// Get list of reservations by a specific user
router.get('/:userId', async (req, res) => {
  const reservations = await Reservation.findAll({
    where: { userId: req.params.userId },
    include: User,
  }).catch((err) => console.log(err))

  res.send(reservations)
})

而错误...

EagerLoadingError [SequelizeEagerLoadingError]:用户未与预订相关联!在 Function._getIncludedAssociation (C:\Users\charl\Desktop\commerce-express\node_modules\sequelize\lib\model.js:709:13) 在 Function._validateIncludedElement (C:\Users\charl\Desktop\commerce-express\ node_modules\sequelize\lib\model.js:613:53) 在 C:\Users\charl\Desktop\commerce-express\node_modules\sequelize\lib\model.js:509:37 在 Array.map () 在 Function. _validateIncludedElements (C:\Users\charl\Desktop\commerce-express\node_modules\sequelize\lib\model.js:504:39) 在 Function.findAll (C:\Users\charl\Desktop\commerce-express\node_modules\sequelize \lib\model.js:1722:12)
在 processTicksAndRejections (internal/process/task_queues.js:95:5) 在异步 Function.findAll (C:\Users\charl\Desktop\commerce-express\node_modules\sequelize\lib\model.js:1916:12) 在异步file:///C:/Users/charl/Desktop/commerce-express/routes/reservations.js:19:24

模型和配置文件:

模型/Cubicle.js

import Sequelize from 'sequelize'
const { DataTypes } = Sequelize
import sequelize from '../config/database.js'

const Cubicle = sequelize.define(
  'Cubicle',
  {
    name: {
      type: DataTypes.STRING,
    },
    floor: {
      type: DataTypes.STRING,
    },
    building: {
      type: DataTypes.STRING,
    },
  },
  {
    timestamps: false,
  }
)

export default Cubicle

模型/User.js

import Sequelize from 'sequelize'
const { DataTypes } = Sequelize
import sequelize from '../config/database.js'

const User = sequelize.define(
  'User',
  {
    email: {
      type: DataTypes.STRING,
    },
    password: {
      type: DataTypes.STRING,
    },
  },
  {
    timestamps: false,
  }
)

export default User

模型/Reservation.js

import Sequelize from 'sequelize'
const { DataTypes } = Sequelize
import sequelize from '../config/database.js'

const Reservation = sequelize.define(
  'Reservation',
  {
    startDate: {
      type: DataTypes.DATEONLY,
    },
    endDate: {
      type: DataTypes.DATEONLY,
    },
  },
  {
    timestamps: false,
  }
)

export default Reservation

配置/数据库.js

import Sequelize from 'sequelize'

const sequelize = new Sequelize('db_name', 'user', 'pwd', {
  host: 'localhost',
  dialect: 'mysql',

  pool: {
    max: 5,
    min: 0,
    aquire: 30000,
    idle: 10000,
  },
})

export default sequelize

后端/server.js

import express from 'express'
import dotenv from 'dotenv'
import sequelize from '../config/database.js'
import users from '../routes/users.js'
import cubicles from '../routes/cubicles.js'
import reservations from '../routes/reservations.js'

import User from '../models/User.js'
import Cubicle from '../models/Cubicle.js'
import Reservation from '../models/Reservation.js'

// Test sequelize
sequelize
  .authenticate()
  .then(() => console.log('Database connected...'))
  .catch((err) => console.log('Error: ' + error))

// Associations
User.belongsToMany(Cubicle, {
  through: Reservation,
})
Cubicle.belongsToMany(User, {
  through: Reservation,
})

// User.sync({ force: true })
// Cubicle.sync({ force: true })
// Reservation.sync({ force: true })

dotenv.config()

const app = express()

app.use(express.json())

// Routes
app.use('/users', users)
app.use('/cubicles', cubicles)
app.use('/reservations', reservations)

const PORT = process.env.PORT || 5000

app.listen(
  PORT,
  console.log(
    `Server is running in ${process.env.NODE_ENV} mode on port ${PORT}`
  )
)

标签: node.jsexpresssequelize.js

解决方案


推荐阅读