【问题标题】:Sequelize operation hanging when returning the result but working when no returning it返回结果时Sequelize操作挂起但不返回时工作
【发布时间】:2021-01-25 20:00:37
【问题描述】:

我已经使用 Node 大约 3 年了,但是现在发生在我身上的事情让我发疯了。

我的项目在过去 6 个月里一直在使用 Sequelize,而且一切运行良好。

如果我尝试使用以下代码更新 myModelObject 实例,它会按预期工作。(我更改了实际代码以便以更清晰的方式显示行为)

...
.then(parameters => {                                    
   myModelObject.update({parameters}, { where: { id: myObjectId }})
   .then(() => {
      console.log("Sequelize update resolved !")      
   })
})
.then( () => {
   console.log("Promise resolved !")
})

这将使我的 myModelObject 在数据库中更新,控制台将显示:

承诺已解决!

1 秒后...

Sequelize 更新已解决!

但是,当我在更新 myModelObject 之前添加 return 时会发生奇怪的行为:

...
.then(parameters => {                                    
   return myModelObject.update({parameters}, { where: { id: myObjectId }})
   .then(() => {
      console.log("Sequelize update resolved !")
   })
})
.then( () => {
   console.log("Promise resolved !")
})

这使我的代码挂起.. 更新永远不会完成并且会发生超时。我的意思是,如果我想退货,Sequelize 更新永远不会解决! 我所有其他 Sequelize 代码都运行良好!

任何 hep 都会非常感激 :)

节点:12.16.0 ||续集:5.21.6 || pg: 7.18.2

【问题讨论】:

  • 您要返回什么?一个promise对象或只是一个字符串“Sequelize update resolved!”
  • 我只是想返回更新的承诺,这样我就可以在它解决后采取行动,但是如果我在“更新”之前添加返回,它会挂起并且永远不会解决
  • 惊讶地发现您的代码不适用于 return !!
  • 正是..快把我逼疯了
  • 鉴于您显示的代码,您在此处描述的内容是不可能的。您在示例中省略了其他内容。

标签: node.js promise sequelize.js


【解决方案1】:

如果有人感兴趣,我发现了问题!。

在调用此方法之前,在代码的另一部分中,已使用 Sequelize Transaction 更新同一对象,但尚未提交该事务。

显然这会导致我的更新挂起。

为了解决这个问题,我还将这个事务传递给我的更新调用。另一种解决方法是在调用我的更新之前结束事务。

【讨论】:

  • 哇,我遇到了完全相同的问题。这可能节省了我数小时的调试时间。
【解决方案2】:

@oriuken,也许你应该试试下面这样的方法。

.then(parameters => {   
  return new Promise(async (resolve, reject) => {
    try {
      await myModelObject.update({parameters}, { where: { id: myObjectId }});
      console.log("Sequelize update resolved !")
      return resolve('Promise resolved')
    }catch(e) {
      return reject(e.message);
    }
  });
})

【讨论】:

  • 我尝试了类似的方法,但没有运气。我也试过你的这个代码,但也没有运气.. 进行“更新”时代码挂起
  • 错误使用承诺。创建额外的不必要的承诺,加上 return resolvereturn reject 什么都不做,请参阅 Promise 规范。
  • 多余的承诺?请再次阅读实际问题和评论部分。我使用 return 的原因,理想情况下它应该是你函数中的最后一个语句。还有,什么都不做?如果您记录它,您将看到“承诺已解决”。带或不带 return 关键字,因为 resolve 和 reject 是回调函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2019-10-04
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多