mongodb 你知道如何实现一个可以被所有路由使用的事务中间件吗?

xfb7svmp  于 2023-04-20  发布在  Go
关注(0)|答案(1)|浏览(204)

这是我的代码。

import mongoose from 'mongoose';

const session = await mongoose.startSession();

session.startTransaction();

export default async function transactionMiddleware(req, res, next) {
    try {
        await session.withTransaction(async () => {
            await next();
        });
    } catch (error) {
        await session.abortTransaction();
        session.endSession();
        return res.status(500).json({message: 'Something went wrong.'});
    }
    await session.commitTransaction();
    session.endSession();
};

And this is how I am using in App.js file.
我的问题是,当我导入这个中间件,它不编译。我期待编译。

import transactionMiddleware  from './src/middlewares/transactionMiddleware.js';

It crashes like this

ohtdti5x

ohtdti5x1#

如果您的目的是创建可重用的代码来处理事务,那么您可能应该使用 Package 器函数。
传递给它一个函数,该函数的参数是交易中要执行的代码:

const transactionWrapper = (callback) => {
    const session = await mongoose.startSession();
    try {
        await session.withTransaction(async () => {
            await callback();
        });
        await session.commitTransaction();
        session.endSession();
    } catch (err) {
        await session.abortTransaction();
        session.endSession();
        throw err;
    }
}

示例用法:

transactionWrapper(async () => {
    await dbOperationOne();
    await dbOperationTwo();
})

相关问题