使用NodeJS+Jest测试API时Mongo Memory Server实例创建失败
内存MongoDB实例启动失败排查方案
问题描述
用NodeJS、Mongo Memory Server和Jest编写API测试用例时,创建内存数据库存储测试数据反复抛出“Mongo Memory Instance Failed”错误,排查多日未解决。
环境版本
- node: 14.6.1
- MongoDB: 5.0.19
- supertest: "^6.3.3"
- jest: "^29.7.0"
- mongodb-memory-server: "^8.15.1"
- mongoose: "^5.9.15"
数据库连接代码
const mongoose = require("mongoose"); const { MongoMemoryServer } = require("mongodb-memory-server"); const dbSetUp = async () => { let mongod = await MongoMemoryServer.create({ instance: { dbName: "platform_db", debug: true } }); // await mongod.start(); const uri = mongod.getUri('platform_db'); console.log(uri) mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true, }, async (err) => { if (err) { console.error(err); return false; } else { return mongod; } }); } const dbDisconnect = async () => { await mongoose.connection.close(); }; module.exports = { dbSetUp, dbDisconnect }
错误日志
Starting the MongoMemoryServer Instance failed, enable debug log for more information. Error: GenericMMSError: Instance failed to start within 10000ms at Timeout.<anonymous> (C:\Users\****\Desktop\testCases\server-apis\node_modules\mongodb-memory-server-core\src\util\MongoInstance.ts:365:21) at listOnTimeout (internal/timers.js:554:17) at processTimers (internal/timers.js:497:7) at MongoMemoryServer.<anonymous> (node_modules\mongodb-memory-server-core\src\MongoMemoryServer.ts:293:17) at node_modules\mongodb-memory-server-core\node_modules\tslib\tslib.js:169:75 at __awaiter (node_modules\mongodb-memory-server-core\node_modules\tslib\tslib.js:165:16) at node_modules\mongodb-memory-server-core\src\MongoMemoryServer.ts:284:68
排查与解决建议
1. 修复异步代码逻辑
你的dbSetUp是async函数,但内部用了mongoose.connect的回调形式,导致函数无法正确返回Promise,回调里的return mongod也不会作为函数返回值传递出去,这会让beforeAll没等数据库连接完成就继续执行,进而引发启动超时。修改为Promise形式:
const dbSetUp = async () => { const mongod = await MongoMemoryServer.create({ instance: { dbName: "platform_db", debug: true, startTimeout: 30000 // 把启动超时时间增加到30秒 } }); const uri = mongod.getUri('platform_db'); console.log(uri); // 用Promise形式的mongoose.connect,等待连接完成 await mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true, }); return mongod; // 返回mongod实例,方便后续停止服务 } const dbDisconnect = async (mongod) => { await mongoose.connection.close(); await mongod.stop(); // 停止内存MongoDB实例,避免残留进程 };
测试时要在beforeAll中接收返回的mongod实例,传给afterAll的dbDisconnect:
let mongodInstance; beforeAll(async () => { mongodInstance = await dbSetUp(); }); afterAll(async () => { await dbDisconnect(mongodInstance); });
2. 调整版本兼容性
当前mongodb-memory-server@8.15.1和node14.6.1、mongoose@5.9.15可能存在兼容性问题:
- 尝试把
mongodb-memory-server降级到7.x版本(该版本对node14支持更友好) - 或者把
mongoose升级到5.13.x版本(适配更高版本的mongodb驱动,同时兼容node14)
3. 避免端口占用
指定一个固定端口启动内存MongoDB,防止默认端口被其他进程占用:
const mongod = await MongoMemoryServer.create({ instance: { dbName: "platform_db", debug: true, startTimeout: 30000, port: 27018 // 指定未被占用的端口 } });
4. 清理残留进程
如果之前的测试没正确停止内存MongoDB实例,可能残留了mongod进程,导致新实例无法启动:
- Windows系统:打开任务管理器,结束所有
mongod.exe进程 - 类Unix系统:执行
pkill mongod命令清理进程
内容的提问来源于stack exchange,提问作者metalhead
相关产品推荐
相关产品推荐

