>修复: 用户存储引擎: "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