首页 > 解决方案 > 在 save() 完成之前 Sequelize 回调

问题描述

这是我的代码:

//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,表 user 包含 clubId;

此代码似乎可以创建和关联模型。但是 console.log 显示的最终俱乐部显示 user: null

但是,在 db 中,表 user 中有良好的行,具有良好的外键,引用了俱乐部 ID

我的日志显示请求选择(来自 Club.findByPk)在更新(来自 club.save)之前完成。像 .then 在 promise 解决之前执行

对不起我的英语不好,希望有人可以帮助

标签: promisesequelize.jsinstance

解决方案


您正在使用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;

推荐阅读