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

mongodb-memory-server调用getUri()报操作状态非法错误

报错触发原因
  • 新版mongodb-memory-server调整了实例生命周期逻辑:执行new MongoMemoryServer()仅完成实例对象初始化,此时实例状态为new,不会自动启动内存MongoDB服务。
  • getUri()方法内置状态校验逻辑,仅允许在服务处于starting(启动中)、running(运行中)状态时调用,未启动就直接调用该方法会直接抛出状态非法错误。
  • 旧版本mongodb-memory-server曾支持实例化后自动启动,大量旧教程的示例代码未包含显式启动步骤,在新版本环境下运行就会触发该问题,属于API用法变更,不是框架未修复的bug,因此没有对应公开issue。
修复方案

调整测试初始化逻辑,在获取连接URI前先完成内存Mongo服务的启动,官方推荐直接使用MongoMemoryServer.create()静态方法,一步完成实例化与启动流程,修改后的测试配置代码如下:

import { MongoMemoryServer } from "mongodb-memory-server";
import mongoose from "mongoose";

let mongo: MongoMemoryServer;
beforeAll(async () => {
  // 静态create方法会自动完成服务启动,返回处于running状态的实例
  mongo = await MongoMemoryServer.create();
  const mongoUri = mongo.getUri();
  await mongoose.connect(mongoUri);
});

beforeEach(async () => {
  const collections = await mongoose.connection.db.collections();
  for (let collection of collections) {
    await collection.deleteMany({});
  }
});

afterAll(async () => {
  await mongo.stop();
  await mongoose.connection.close();
});

补充说明:如果偏好分步写法,也可以保留new MongoMemoryServer()的实例化方式,但是必须在调用getUri()前加一行await mongo.start()等待服务启动,效果和使用create方法一致。

内容的提问来源于stack exchange,提问作者Eccentric291

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:24:22