Ошибка Sequelize .set, .set не является функцией - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь настроить ассоциацию ownTo и 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) работает успешно, но это не то, что мне нужно

EDIT

Вот что такое 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 }

Возвращается после ввода информации об одном бойце в базу данных.

1 Ответ

1 голос
/ 17 июня 2020

Проблема заключается в именовании ваших моделей.

Sequelize ожидает, что ваши модели будут именоваться в единственном числе (User вместо Users), поэтому он путается с тем, как следует называть сгенерированные методы установки и получения для вашей ассоциации.

Если вы попробуете fighterData.setUser(userData) вместо fighterData.setUsers(userData), он должен работать.

Если вы хотите использовать вместо setUsers, вы необходимо внести изменения в вашу модель, чтобы указать Sequelize использовать Users в качестве формы единственного числа User:

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

Вы также можете перезаписать множественное число таким же образом.

Подробнее об этом можно прочитать здесь: Стратегия именования Sequelize

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...