最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Mongoose return value from withTransaction callback - Stack Overflow

programmeradmin1浏览0评论

I want to utilize mongoose's withTransaction helper particularly for its ability to automatically retry transient transaction errors. However, it seems that the withTransaction helper is incapable of returning data, which is a problem for me.

I have code that looks like:

import { startSession } from 'mongoose';

async addItem(itemData) {
    const session = await startSession();
 
    session.startTransaction();
    try {
        const item = await new Item({ itemData }).save({ session });
        
        // a bunch of other async operations...

       await sessionmitTransaction();
       session.endSession();

       return item;
    } catch (error) {
        await session.abortTransaction();
        session.endSession();
        throw error;
    }
}

How can I either (1) use the withTransaction helper but still have this function returning the item as it currently does, or (2) make this function automatically retry on transient transaction errors through some way other than using withTransaction.

I want to utilize mongoose's withTransaction helper particularly for its ability to automatically retry transient transaction errors. However, it seems that the withTransaction helper is incapable of returning data, which is a problem for me.

I have code that looks like:

import { startSession } from 'mongoose';

async addItem(itemData) {
    const session = await startSession();
 
    session.startTransaction();
    try {
        const item = await new Item({ itemData }).save({ session });
        
        // a bunch of other async operations...

       await session.mitTransaction();
       session.endSession();

       return item;
    } catch (error) {
        await session.abortTransaction();
        session.endSession();
        throw error;
    }
}

How can I either (1) use the withTransaction helper but still have this function returning the item as it currently does, or (2) make this function automatically retry on transient transaction errors through some way other than using withTransaction.

Share Improve this question edited Oct 26, 2020 at 0:29 D. SM 14.5k3 gold badges14 silver badges22 bronze badges asked Jul 12, 2020 at 0:03 Infamous911Infamous911 1,5314 gold badges26 silver badges46 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 7

This appears to be a known issue in the node driver. Some workarounds are provided in that ticket.

I wrote a simple helper that internally uses withTransaction to solve the problem and make transactions less verbose with mongoose.

After installing mongoose-trx you can simply do:

const transaction = require('mongoose-trx');

const [customer] = await transaction(session => Customer.create([{ name: 'Test' }], { session }));

// do whatever you need to do with the customer then return it

It supports transaction options as well, see the documentation on how to do it.

发布评论

评论列表(0)

  1. 暂无评论