gpt4 book ai didi

node.js - 将事务序列化为 Express 中间件

转载 作者:行者123 更新时间:2023-12-02 02:36:48 24 4
gpt4 key购买 nike

我正在尝试将 Sequelize 交易添加到我的 Express 应用程序中,但没有成功。我在整个应用程序中使用 async/await,并且按照 Sequelize 事务文档中的说明,使用“cls-hooked”包创建了命名空间。

Sequelize.useCLS(require('cls-hooked').createNamespace('db'));

我的中间件非常简单,看起来像这样

module.exports = () => (req, res, next) => sequelize.transaction(async () => next());

和 app.js 中

app.use(sequelizeTransaction());
app.use('/api', apiRoutes);

我也尝试过直接在路由上使用中间件,但得到的结果与上面相同

router.post('/', sequelizeTransaction(), async (req, res) => {
await serviceThatDoesTwoDBOperations();
});

结果是我得到了事务,但仅围绕第一个数据库操作。之后的所有内容都将被忽略,并且不会因错误而发生回滚。我可能做了一些明显错误的事情,但我无法指出它。

最佳答案

我也遇到了和你一样的问题。这就是我让它发挥作用的方法。由于某种原因,sequelize 在实际完成之前清除了命名空间上的事务。

还要确保您使用的 async_hooks 版本为 Node > 8.5。

export const transactionMiddleware = async (req, res, next) => {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.bind(next);
namespace.run(async () => {
const transaction = await sequelize.transaction();
namespace.set('transaction', transaction);
onFinished(res, (err) => {
if (!err) {
transaction.commit();
} else {
transaction.rollback();
}
});
next();
});
};

我希望这对你有用:)

关于node.js - 将事务序列化为 Express 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48587478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com