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
相关产品推荐
相关产品推荐

