2

固定:用户存储引擎:“wiredTiger”

我使用 Mocha / Chai / Supertest 和 Mongodb-Memory-Server 来测试我的应用程序。但是我收到错误:Transaction numbers are only allowed on storage engines that support document-level locking

在真实的数据库和邮递员的测试中,它运行良好。

我的代码:

在 database.js 中

const mongoose = require('mongoose')
const { MongoMemoryReplSet } = require('mongodb-memory-server')

mongoose.set('useFindAndModify', false);
const connect = async () => {
    try {
        let url = process.env.MONGO_URL

        let options = {
            //Something
        }
        if (process.env.NODE_ENV === 'test') {
            const replSet = new MongoMemoryReplSet();
            await replSet.waitUntilRunning();
            const uri = await replSet.getUri();

            await mongoose.connect(uri, options)

            //log connected
        } else {
            await mongoose.connect(url, options)
            //log connected
        }
    } catch (error) {
        //error
    }
}

我有两个模型:公司和用户。我做了一个功能,用 used 将成员添加到公司transaction。我的代码

const addMember = async (req, res, next) => {
    const { companyId } = req.params
    const { userId } = req.body

    const session = await mongoose.startSession()
    try {
        await session.withTransaction(async () => {
            const [company, user] = await Promise.all([
                Company.findOneAndUpdate(
                    //Something
                ).session(session),

                User.findByIdAndUpdate(
                    //Something
                ).session(session)
            ])

            //Something if... else

            return res.json({
                message: `Add member successfully!`,
            })
        })
    } catch (error) {
        //error
    }
}

这是路由器:

router.post('/:companyId/add-member',
    authentication.required,
    company.addMember
)

测试文件:

const expect = require('chai').expect
const request = require('supertest')
const app = require('../app')

describe('POST /company/:companyId/add-member', () => {
    it('OK, add member', done => {
        request(app).post(`/company/${companyIdEdited}/add-member`)
        .set({ "x-access-token": signedUserTokenKey })
        .send({userId: memberId})
        .then(res => {
            console.log(res.body)
            expect(res.statusCode).to.equals(200)
            done()
        })
        .catch((error) => done(error))
    })
})

我收到错误:事务号只允许在支持文档级锁定的存储引擎上使用'

我怎样才能解决这个问题?

4

1 回答 1

2

添加retryWrites=false到您的数据库 uri。下面的例子:

mongodb://xx:xx@xyz.com:PORT,zz.com:33427/database-name?replicaSet=rs-xx&ssl=true&retryWrites=false

于 2020-02-26T14:45:07.770 回答