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

在Next.js的_middleware.ts文件中通过Mongoose连接MongoDB时遭遇regeneratorRuntime未定义错误的解决方法咨询

解决Next.js Middleware中Mongoose连接MongoDB出现regeneratorRuntime未定义的问题

这个问题我之前帮朋友排查过,本质是Next.js Middleware默认的运行时环境和Mongoose的适配冲突导致的,我给你拆解下原因和具体解决办法:

错误原因

你看到的regeneratorRuntime is not defined错误,主要是因为:

  • Next.js Middleware默认使用Edge Runtime,这个环境不支持Node.js的一些核心API,而且Mongoose的浏览器版本(也就是报错里的browser.umd.js)被错误加载了
  • 浏览器版本的Mongoose依赖regeneratorRuntime来处理异步代码,但Edge环境并没有内置这个模块,所以就抛出了未定义的错误

最靠谱的解决方案:切换Middleware到Node.js运行时

Edge Runtime虽然轻量,但对Mongoose这类依赖Node.js核心模块的库兼容性不好,直接把Middleware切换到Node.js运行时就能解决大部分问题:

在你的./pages/_middleware.ts文件顶部添加运行时配置:

// 配置Middleware使用Node.js运行时
export const config = {
  runtime: 'nodejs',
};

之后Middleware会在标准Node.js环境中运行,Mongoose会自动加载适配Node.js的版本,regeneratorRuntime的问题自然就消失了,同时也能正常使用Mongoose的所有功能。

辅助优化:使用单例模式管理MongoDB连接

另外,在Middleware里连接MongoDB时,一定要用单例模式,避免每次请求都创建新连接(会导致性能问题),可以写一个复用的连接函数:

import mongoose from 'mongoose';

// 标记是否已经建立连接
let isConnected = false;

export async function connectToMongoDB() {
  if (isConnected) {
    console.log('复用已有的MongoDB连接');
    return;
  }

  try {
    await mongoose.connect(process.env.MONGODB_URI!);
    isConnected = true;
    console.log('MongoDB连接成功');
  } catch (error) {
    console.error('MongoDB连接失败:', error);
    throw error;
  }
}

之后在Middleware的逻辑里调用connectToMongoDB()即可。

备选方案:强制导入Mongoose的Node.js版本

如果暂时不想切换运行时,可以尝试强制导入Mongoose的Node.js适配版本,避免加载浏览器版:

// 直接指定导入Node.js版本的Mongoose
import mongoose from 'mongoose/dist/node.umd.js';

不过这个方案不推荐长期使用,因为Edge Runtime本身还是不支持Mongoose依赖的部分Node.js API,后续可能会出现其他报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:12:49