Node.js Sequelize操作在返回结果时挂起,但在不返回结果时工作
我在Node工作了大约3年,但现在发生在我身上的事情让我发疯 我的项目在过去的6个月里使用了Sequelize,一切都很好 如果我尝试用以下代码更新myModelObject实例,它将按预期工作。(我更改了实际代码,以便以更清晰的方式显示行为) 这将使我的myModelObject在DB中更新,控制台将显示: 承诺解决 1秒钟后 续集更新已解决 但是,当我在更新myModelObject之前添加一个返回时,会发生奇怪的行为:Node.js Sequelize操作在返回结果时挂起,但在不返回结果时工作,node.js,promise,sequelize.js,Node.js,Promise,Sequelize.js,我在Node工作了大约3年,但现在发生在我身上的事情让我发疯 我的项目在过去的6个月里使用了Sequelize,一切都很好 如果我尝试用以下代码更新myModelObject实例,它将按预期工作。(我更改了实际代码,以便以更清晰的方式显示行为) 这将使我的myModelObject在DB中更新,控制台将显示: 承诺解决 1秒钟后 续集更新已解决 但是,当我在更新myModelObject之前添加一个返回时,会发生奇怪的行为: ... .then(parameters => {
...
.then(parameters => {
return myModelObject.update({parameters}, { where: { id: myObjectId }})
.then(() => {
console.log("Sequelize update resolved !")
})
})
.then( () => {
console.log("Promise resolved !")
})
这使我的代码挂起。。更新从未完成,并且会发生超时。我的意思是,如果我想返回,Sequelize更新永远不会解决!
我所有其他的Sequelize代码都工作得很好
任何hep都将非常感谢:)
Node:12.16.0 | | |续集:5.21.6 | | pg:7.18.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);
}
});
})
如果有人感兴趣,我发现了问题 在调用此方法之前,在代码的另一部分中,使用Sequelize事务更新同一对象,但该事务尚未提交 显然,这会导致我的更新挂起
为了解决这个问题,我还将这个事务传递给了我的更新调用。另一种解决方法是在调用“我的更新”之前结束事务。您想返回什么?promise对象或字符串“Sequelize update resolved!”我只想返回更新的承诺,以便在解决后可以执行操作,但是如果我在“update”之前添加了返回,它将挂起,并且永远不会解决。如果看到您的代码没有使用
返回
,我会大吃一惊!!确切地你在这里描述的是不可能的,因为你展示的代码。在你的例子中,你一定忽略了其他一些事情。我尝试了类似的事情,但没有成功。我也试过你的密码,但也不走运。。当“更新”不恰当地使用承诺时,代码会变得笨拙。创建额外的不必要承诺,加上返回解决
和返回拒绝
什么都不做,请参阅承诺规范。额外的不必要承诺?请再次阅读实际问题和评论部分。我之所以使用return,理想情况下它应该是函数中的最后一条语句。还有,什么也不做?如果您将其记录下来,您将看到“承诺已解决”。带或不带return关键字,因为resolve和reject是回调函数。哇,我遇到了完全相同的问题。这可能为我节省了数小时的调试时间。
.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);
}
});
})