我仍然可以在事务中使用Sequelize V6的BlueBird调用吗?



对于我从sequelize v5迁移过来的一个项目—>v6如前所述,现在应该使用cls-hooked而不是continuation-local-storage。我现在用的是cls-hooked。另一个突破性的变化是BlueBird被原生的Promises所取代。然而,我有很多代码包装了Sequelize调用(在事务的生命周期内),这些代码仍然使用BlueBird,因为它有很多方便的helper方法,而原生promise却没有。

然而,现在有时(但不一致)像这样奇怪的错误会被Sequelize提到:Error, error stacktrace: Error: commit has been called on this transaction(83e3c09b-efd4-4a32-bc1e-2f009a20b9c0), you can no longer use it. (The rejected query is attached as the 'sql' property of this error)。从逻辑上讲,这对我来说没有意义,因为在事务提交之前应该已经完成了查询(并且在使用continuation-local-storage时工作得很好)。如果我为那个特定的呼叫交换了BlueBird和Promise,我就不能再重现这个问题了。

在使用sequelize V5时,我使用cls-bluebird来解决这些类似的问题,方法是修补continuationlocal -storage名称空间:

import * as cls from 'continuation-local-storage'
....
const clsBluebird = require('cls-bluebird');
clsBluebird(nameSpace);

然而,cls-bluebird是专门为continuation-local-storage制作的(参见cls-bluebird的自述文件):

补丁蓝鸟continuation-local-storage支持。

在Sequelize V6中,可以像这样修补与cls挂钩的命名空间:

const cls = require('cls-hooked');
const nameSpace = cls.createNamespace("some-constant");
const clsBluebird = require('cls-bluebird');
clsBluebird(nameSpace);
有趣的是,这修复了我的"Commit被调用…";问题,但我怀疑让cls-bluebird修补不受支持的cls-hooked

库是否可靠。有人能证实吗?如果没有,我想我唯一的选择是用本地承诺取代我所有的蓝鸟调用?

我在cls-hooked的repo中发现了这个问题,作者似乎建议cls-bluebird与cls-hooked一起工作。

快速回答:是的,您将失去未打补丁的蓝鸟的上下文。看看"cls-bluebird"https://github.com/TimBeyer/cls-bluebird。

最新更新