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

Posted

技术标签:

【中文标题】NodeJS Sequelize:与别名 [alias] 的关联在 [model] 上不存在【英文标题】:NodeJS Sequelize: Association with alias [alias] does not exist on [model] 【发布时间】:2020-01-24 23:04:48 【问题描述】:

我正在将 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,
;
/* 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,
;

这是我加载模型的方式:

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,
;

最后,这是我得到这个错误的查询:

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;

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

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

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

谢谢,

【问题讨论】:

【参考方案1】:

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

【讨论】:

你好,朋友。你是怎么意识到的?我看到了您的答案,它对我有用,我有一个名为 Payments(复数)的模型,它向我显示了与您相同的错误,当我看到您的答案时,我尝试放置 Payment(单数)并且它有效,但我没有不明白为什么。检查我的数据库,该表称为 Payments(复数),它与关联或什么有关?我真的什么都不懂,能不能给我解释一下? @JulianProg 嗨,伙计,我通过阅读文档和尝试实现了这一点。如果不查看模型和迁移文件,很难说出问题所在。但基本上要知道,当你有一个 hasMany 关联时,你需要复数关联的模型。例如,如果我采用与上面写的相同的代码,我有两个模型:用户和播放列表。我的用户模型与播放列表模型有一个 hasMany 关联。但是因为我使用了hasMany,所以我不得不复数播放列表,所以我不得不写这个:User.hasMany(models.Playlists, foreignKey: 'user_id' ); // models.Playlists(复数形式) 如果我创建了一个 hasOne 关联而不是 hasMany 关联,我将不得不编写 model.Playlist 而不是 model.Playlists。希望它会有所帮助

以上是关于NodeJS Sequelize:与别名 [alias] 的关联在 [model] 上不存在的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize.js 与非别名关联一起加入别名关联

GraphQL/Sequelize:SQL 别名

Sequelize - 将字段映射到模型定义中的字段别名

用nodejs sequelize中指定的字段隐藏db中的一个结果。

nodejs:sequelize数据库查询的Op方法

如何在 SEQUELIZE (nodeJS) 中创建触发器?