【发布时间】:2023-04-03 22:32:01
【问题描述】:
我正在使用 Jest 为 Node/Express/Mongo 项目设置测试。我尝试编写一个函数来清除集合,因此每个测试都从一个干净的状态开始:
const clearCollection = (collectionName, done) => {
const collection = mongoose.connection.collections[collectionName]
collection.drop(err => {
if (err) throw new Error(err)
else done()
)
}
beforeEach(done => {
clearCollection('users', done)
})
又一次尝试,承诺:
const clearCollection = collectionName => {
const collection = mongoose.connection.collections[collectionName]
return collection.drop()
}
beforeEach(async () => {
await clearCollection('users')
})
问题是它们都在工作和抛出错误之间交替。每次我保存文件时,它要么完美运行,要么抛出错误,每次交替。错误总是以下之一:
MongoError: cannot perform operation: a background operation is currently running for collection auth_test.users
MongoError: ns not found
通过让clearCollection() 在catch() 中调用自身,我可以让它在 100% 的时间内工作(无论如何都会受到堆栈的限制),但这感觉很不对:
const clearCollection = collectionName => {
const collection = mongoose.connection.collections[collectionName]
return collection.drop()
.catch(() => clearCollection(collectionName))
}
【问题讨论】:
-
FWIW,大多数(如果不是全部)异步 MongoDB 方法返回承诺,所以
return collection.drop()应该足够了。 -
你是对的,但它仍然会每隔一段时间抛出相同的错误。我会更新我的问题以反映您的建议。
-
它闻起来有点像在删除操作完成之前解决的承诺(AFAICS,删除集合会锁定数据库,这可以解释您遇到的第一个错误)。我怀疑它会解决任何问题,但是您是否尝试过让
beforeEach()返回一个承诺而不是使用async/await? -
@robertklep 我有,事实上这是我开始使用 async/await 之前的第一次迭代。那时它也没有工作。据我所知,async/await 只是用于执行此操作的语法糖。
-
你是对的,这就是为什么我怀疑它会解决任何问题;)
标签: node.js mongodb mongoose promise async-await