You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:36:00