如何使用Sequelize将id传递给其关联的记录

时间:2018-05-25 04:24:52

标签: postgresql express sequelize.js

我正在使用Express on backend,Postgres for db和Sequelize for ORM构建应用程序。

我有3个相关模型:

Post
Event
Publishing,属于Post,属于Event

当我发布Post时,我将其状态更新为2,我需要创建EventPublishingPublishing将包含postIdeventId,以及我通过查询传递的其他内容。我尝试了下面的代码,它改变了Post的状态,创建了一个Event和Publishing,但它们彼此没有关系。

  publishPost(req) {
    return new Promise((resolve, reject) => {
      async.parallel({
        changeState: (callback) => {
          Post.findAll({
            where: { id: req.query.post_id },
            attributes: ['id', 'state']
          })
          .then((updateState) => {
            updateState.forEach((postState) => {
              postState.updateAttributes({ state: 2 });
            });
          })
          .then((updatedState) => {
            callback(null, updatedState);
          });
        },
        createEvent: (callback) => {
          Event.create({
            instructions: req.query.instructions,
          })
          .then((createdEvent) => {
            callback(null, createdEvent);
          });
        },
        createPublishing: (callback) => {
          Publishing.create({
            start_date: req.query.startDate,
            end_date: req.query.endDate,
          })
          .then((createdPublishing) => {
            callback(null, createdPublishing);
          });
        }
      }, (error, result) => {
        resolve(result);
      });
    });
  }

如何将两条记录的ID传递给第三个模型?

1 个答案:

答案 0 :(得分:0)

您的实施有几个问题! 首先,您的承诺永远不会拒绝。

尽管如此,您实际上并不需要为此创建承诺或使用异步,也不希望它们并行运行:如果创建Publishing记录需要有关{{1}的信息},那么你想首先创建事件,以便你有Event,然后在输入中传递它。

另一件重要的事情,请看一下这段代码:

id

在第一个内部,你正在进行多次更新,这是承诺。他们将被派遣,你永远不会得到他们的价值。让我解释一下:

想想你是否只有一个更新。它会是这样的:

  .then((updateState) => {
    updateState.forEach((postState) => {
      postState.updateAttributes({ state: 2 });
    });
  })
  .then((updatedState) => {
    callback(null, updatedState);
  });

请参阅,我们将返回一个承诺(在本例中为更新),因此只有在更新结算时才会调用下一个 .then((updateStates) => { return updateStates[0].updateAttributes({ state: 2 }); })

如果我们这样做:

then

它将调度更新(这需要时间),但因为你没有返回它,它将通过并返回任何内容。看看这个:

  .then((updateStates) => {
    updateStates[0].updateAttributes({ state: 2 });
  })

因此,您正在调用多个更新而不返回其值;如果他们失败了,你永远不会知道。

还有一件事:如果在此过程中出现问题,您可能想要回滚到目前为止所做的所有更改,为此,您应该使用事务。

也许你应该尝试这样的事情(未经测试):

var promise1 = new Promise(function(resolve, reject) {
  setTimeout(function(){
    resolve('foo')
  }, 2);
});

var promise2 = new Promise(function(resolve, reject) {
  setTimeout(function(){
    resolve('foo2')
  }, 2);
});


promise1
  .then(function(result){
    promise2
  })
  .then(function(result){
    console.log(result) //will print undefined
  })

promise1
  .then(function(result){
    return promise2
  })
  .then(function(result){
    console.log(result) //will print foo2
  })