【问题标题】:Sequelize .set error, .set is not a functionSequelize .set 错误,.set 不是函数
【发布时间】:2020-10-06 17:23:15
【问题描述】:

我正在尝试建立一个似乎正在工作的 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 }

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

【问题讨论】:

  • 你在哪里定义“fighterData”?
  • @OscarVelandia fighterData 是运行 Fighters.create() 时在承诺链中返回的模型
  • 如果你做 fighterData 的 console.log 你会得到什么?
  • @OscarVelandia 我对 OP 进行了编辑

标签: javascript mysql node.js join sequelize.js


【解决方案1】:

问题在于模型的命名。

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

如果您尝试使用fighterData.setUser(userData) 而不是fighterData.setUsers(userData),它应该可以工作。

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

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

你也可以用同样的方法覆盖复数形式。

您可以在此处阅读更多信息:Sequelize naming strategy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    相关资源
    最近更新 更多