NodeJS Sequelize:[model] 上不存在与别名 [alias] 的关联

Fak*_*ake 6 postgresql associations node.js express sequelize.js

我正在将 NodeJS 和 Sequelize 用于学校项目,并且正在努力建立与 sequelize 相关的工作。我之前尝试过几件事,但没有什么让我开心的。

基本上问题是用户可以有多个播放列表(hasMany)。一个播放列表属于一个用户(belongsTo)。

我的错误是: 用户上不存在与别名“播放列表”的关联

这是我的模型:

/* USER MODEL */
const Sequelize = require('sequelize');
const { db } = require('../utils/db');

const User = db.define('users', {
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: Sequelize.INTEGER,
  },
  userID: {
    type: Sequelize.INTEGER,
    allowNull: false,
    field: 'user_id',
  },
  firstName: {
    type: Sequelize.STRING,
    field: 'first_name',
    allowNull: false,
  },
}, {
  underscored: true,
  tableName: 'users',
  freezeTableName: true, // Model tableName will be the same as the model name
});

module.exports = {
  User,
};
Run Code Online (Sandbox Code Playgroud)
/* PLAYLIST MODEL */

const sequelize = require('sequelize');
const { db } = require('../utils/db');

const Playlist = db.define('playlist', {
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: sequelize.INTEGER,
  },
  name: {
    type: sequelize.STRING,
    field: 'name',
    allowNull: false,
  },
  coverUrl: {
    type: sequelize.STRING,
    field: 'cover_url',
    allowNull: true,
  },
  ownerId: {
    type: sequelize.INTEGER,
    allowNull: false,
    references: {
      model: 'users',
      key: 'user_id',
    },
  },
}, {
  underscored: true,
  tableName: 'playlist',
  freezeTableName: true,
});

module.exports = {
  Playlist,
};

Run Code Online (Sandbox Code Playgroud)

这是我加载模型的方式:

const { Credentials } = require('./credentials');
const { User } = require('./users');
const { Playlist } = require('./playlist');

function loadModels() {
  User.associate = (models) => {
    User.hasMany(models.Playlist, { as: 'playlist' });
  };

  Playlist.associate = (models) => {
    Playlist.belongsTo(models.User, { foreignKey: 'owner_id', as: 'owner' });
  };

  Credentials.sync({ force: false });
  User.sync({ force: false });
  Playlist.sync({ force: false });
}

module.exports = {
  loadModels,
};
Run Code Online (Sandbox Code Playgroud)

最后,这是我收到此错误的查询:

const express = require('express');
const { auth } = require('../../middlewares/auth');
const { Playlist } = require('../../models/playlist');
const { User } = require('../../models/users');

const router = express.Router();

router.get('/playlist', [], auth, (req, res) => {
  User.findOne({
    where: { userID: req.user.user_id }, include: 'playlist',
  }).then((r) => {
    console.log(r);
  });
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取属于用户的所有播放列表。

我删除了所有无用的代码(jwt 检查等。)所以当我在 /playlist 上执行 get 请求时,我得到: 未处理的拒绝错误:用户上不存在与别名“播放列表”的关联

我理解错误,但不明白为什么我会得到这个。我错过了什么,有什么想法吗?

谢谢,

Fak*_*ake 8

我最终通过迁移重新制作所有模型和定义来修复它。我遇到了同样的问题,解决方案是 Sequelize 使模型名称复数,因此在我的情况下,用户不存在“播放列表”,因为 Sequelize 使我的模型复数,所以我必须改为“播放列表”。