Sequelize обратный вызов до завершения save () - PullRequest
0 голосов
/ 12 ноября 2018

вот мой код:

//Models definition
var User = sequelize.define('user', ...);
var Address = sequelize.define('address', ...);
var Club = sequelize.define('club', ...);
//Club scopes
  scopes: {
    withUser: {
      include: [
        { model: User }
      ]
    },

//Models associations
User.hasOne(Address);
Club.hasOne(User);
Club.hasOne(Address);



//Main

//Create address
  var addressToCreate = {};
  if(body.address) addressToCreate.address = body.address;
  if(body.city) addressToCreate.city = body.city;
  if(body.zipCode) addressToCreate.zipCode = body.zipCode;

//Get user from db
  var user = await User.findByPk(body.user);


  var clubToCreate = { name: body.name, phone: body.phone };

//Persist Address in db
  return Address.create(addressToCreate)
  .then(address => {

//Persist club in db
    return Club.create(clubToCreate)
    .then(club => {

//Associate User and Address to Club
      club.setAddress(address);
      club.setUser(user);

//Save club with associated models
      return club.save()
    })
    .then(club => Club.scope('withUser').findByPk(club.id))
    .then(club => { console.log(club); return club; })
  })

В моей базе данных адрес таблицы содержит userId и clubId, а пользователь таблицы содержит clubId;

Этот код работает для создания и связывания моделей.Но последний клуб, отображаемый console.log, показывает пользователя: null

Тем не менее, в db есть хорошая строка в таблице user с хорошим внешним ключом, который ссылается на идентификатор клуба

Мои журналы показываютчто запрос на выбор (из Club.findByPk) выполняется перед обновлением (из club.save).Например, .hen выполняется до выполнения обещания

Извините за мой плохой английский, надеюсь, кто-то может помочь

1 Ответ

0 голосов
/ 12 ноября 2018

Вы используете async/await, но смешиваете его со старым стилем обещаний, основанным на вашем коде, который выбирает пользователей.Ниже приведена копия вашего кода в стиле async/await, хотя вам может не потребоваться повторное получение объекта club и т. Д., Поэтому продолжайте отладку.

const address = await Address.create(addressToCreate);
let club = await Club.create(clubToCreate);
console.log('created club', club);

club.setAddress(address);
club.setUser(user);
await club.save();
console.log('saved club', club);

club = await Club.scope('withUser').findByPk(club.id);
console.log('reloaded club', club);
return club;
...