首页 > 解决方案 > Sequelize .set 错误,.set 不是函数

问题描述

我正在尝试建立一个似乎正在工作的 belongsTo 和 hasMany 关联,但是当我运行 .set 时出现错误fighterData.setUsers is not a function。方言是mySql。这是我的代码:

Fighters.belongsTo(Users)
Users.hasMany(Fighters);

Users.sync()
Fighters.sync()
//creates the table if it doesn't exist

const insertFighter = function(obj, sessId) {
  return Fighters.create(obj, {returning: true}).then((fighterData) => {
    //console.log('inserted a fighter \n', fighterData);
    return Users.findOne({
      where: {
        id: sessId
      }
    }).then((userData) => {
      //console.log('fighterData in findOne promise \n', fighterData)
      return fighterData.setUsers(userData)
    }).then((success)=> {
      console.log('user fighter join success')
      return
    }).catch((err)=> {
      console.log('user fighter join error \n', err)
      return
    })
  }).catch((err)=> {
    console.log('error inserting fighter \n', err);
  })
}

记录的错误是user fighter join error. 有趣的是,userData.setFighters(fighterData)工作成功,但这不是我需要的

编辑

这就是 fighterData 是什么:

fighterData in findOne promise 
 Fighters {
  dataValues:
   { id: 7,
     name: 'Gilbert Burns',
     image:
      'https://www.sherdog.com/image_crop/200/300/_images/fighter/20140806063215_IMG_8432.JPG',
     next_opponent: 'Kamaru Usman',
     next_fight: 'July 11, 2020 ',
     style: 'mma',
     updatedAt: 2020-06-17T06:00:40.368Z,
     createdAt: 2020-06-17T06:00:40.368Z },
  _previousDataValues:
   { name: 'Gilbert Burns',
     image:
      'https://www.sherdog.com/image_crop/200/300/_images/fighter/20140806063215_IMG_8432.JPG',
     next_opponent: 'Kamaru Usman',
     next_fight: 'July 11, 2020 ',
     style: 'mma',
     id: 7,
     createdAt: 2020-06-17T06:00:40.368Z,
     updatedAt: 2020-06-17T06:00:40.368Z,
     UserId: undefined },
  _changed:
   { name: false,
     image: false,
     next_opponent: false,
     next_fight: false,
     style: false,
     id: false,
     createdAt: false,
     updatedAt: false,
     UserId: false },
  _modelOptions:
   { timestamps: true,
     validate: {},
     freezeTableName: false,
     underscored: false,
     paranoid: false,
     rejectOnEmpty: false,
     whereCollection: null,
     schema: null,
     schemaDelimiter: '',
     defaultScope: {},
     scopes: {},
     indexes: [],
     name: { plural: 'Fighters', singular: 'Fighter' },
     omitNull: false,
     sequelize:
      Sequelize {
        options: [Object],
        config: [Object],
        dialect: [MysqlDialect],
        queryInterface: [QueryInterface],
        models: [Object],
        modelManager: [ModelManager],
        connectionManager: [ConnectionManager],
        importCache: {} },
     hooks: {} },
  _options:
   { isNewRecord: true,
     _schema: null,
     _schemaDelimiter: '',
     attributes: undefined,
     include: undefined,
     raw: undefined,
     silent: undefined },
  isNewRecord: false }

这是从将一名战斗机的信息输入数据库中返回的。

标签: javascriptmysqlnode.jsjoinsequelize.js

解决方案


问题在于模型的命名。

Sequelize 期望您的模型以单数形式命名(User而不是Users),因此它与应该为您的关联生成的 setter 和 getter 方法命名混淆。

如果您尝试fighterData.setUser(userData)代替fighterData.setUsers(userData),它应该可以工作。

如果您想setUsers改用,则必须对模型进行调整,以告诉 SequelizeUsers用作 的单数形式User

Users.init({
    sessId: Sequelize.STRING
 }, {
    sequelize: sequelize,
    name: {
        singular: 'users'
    }
});

您也可以以相同的方式覆盖复数形式。

您可以在此处阅读有关此内容的更多信息:续集命名策略


推荐阅读