事务编号只允许在支持文档级锁定的存储引擎上 - MongodbMemoryServer/Mochai/Chai/Supe



>修复: 用户存储引擎: "wiredTiger">

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

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

我的代码:

在数据库中.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
}
}

我有两个模型:公司和用户。我做了一个函数,用二手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))
})
})

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

我该如何解决这个问题?

retryWrites=false添加到数据库 uri。示例如下:

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

最新更新