使用mongodb-memory-server与Jest测试时遇MongooseError超时问题
解决Mongoose操作缓冲超时(buffering timed out)问题(mongodb-memory-server + Jest)
出现MongooseError: Operation users.findOne() buffering timed out after 10000ms错误,核心原因是Mongoose执行数据库操作时,并未成功连接到内存MongoDB实例,或连接未完成就启动了测试。以下是针对性解决步骤:
1. 检查测试前置脚本(setup.ts)的连接逻辑
确保所有测试执行前,内存MongoDB已启动且Mongoose连接完成。标准setup.ts实现如下:
import mongoose from 'mongoose'; import { MongoMemoryServer } from 'mongodb-memory-server'; let mongo: MongoMemoryServer; // 所有测试启动前:启动内存Mongo并建立连接 beforeAll(async () => { mongo = await MongoMemoryServer.create(); const mongoUri = mongo.getUri(); // 必须等待连接完成,避免异步操作未就绪 await mongoose.connect(mongoUri); }); // 每个测试前清空数据库,避免测试间数据污染 beforeEach(async () => { const collections = await mongoose.connection.db.collections(); for (const collection of collections) { await collection.deleteMany({}); } }); // 所有测试结束后清理资源 afterAll(async () => { await mongoose.connection.close(); await mongo.stop(); });
关键注意点:
- 必须用
async/await等待MongoMemoryServer.create()和mongoose.connect()完成,否则测试会在连接建立前执行。 - 确认setup.ts的路径在Jest配置中正确(你的package.json里
setupFileAfterEnv路径为./src/test/setup.ts,需确保文件存在)。
2. 验证Mongoose模型与测试连接的关联
确保User模型基于全局Mongoose连接创建,而非自定义连接实例:
// src/models/User.ts import mongoose from 'mongoose'; const userSchema = new mongoose.Schema({ email: { type: String, required: true }, password: { type: String, required: true } }); // 使用全局mongoose.model创建模型,确保关联到测试时的连接 export const User = mongoose.model('User', userSchema);
如果模型使用了自定义连接(如mongoose.createConnection()),需确保该连接也指向内存MongoDB实例。
3. 排查Jest配置问题
确认package.json中的Jest配置满足以下要求:
testEnvironment: "node":mongodb-memory-server依赖Node环境,不能使用jsdom。setupFileAfterEnv路径正确:若setup.ts放在其他目录,需调整路径确保Jest能加载到该脚本。
4. 临时开启缓冲禁用(辅助排查)
若以上步骤仍无法定位问题,可在连接时禁用Mongoose的操作缓冲,让错误直接抛出而非等待超时:
await mongoose.connect(mongoUri, { bufferCommands: false, // 禁用操作缓冲 bufferMaxEntries: 0 });
这样如果连接未建立,测试会立即抛出"not connected"错误,帮助快速定位连接问题。
内容的提问来源于stack exchange,提问作者boye
相关产品推荐
相关产品推荐

