gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:09:05 24 4
gpt4 key购买 nike

已修复:用户存储引擎:“wiredTiger”

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

在真实数据库和 postman 测试中,它运行良好。

我的代码:

在 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
}
}

我有两个模型:公司和用户。我创建了一个函数,可以使用使用过的 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

关于javascript - 事务编号只允许在支持文档级锁定的存储引擎上使用 - MongodbMemoryServer/Mochai/Chai/Supertest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57801290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com