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

