Next.js 14+Mongoose部署Vercel遇Edge Runtime动态代码评估错误
问题原因分析:Next.js 14 + Mongoose 8.4.4部署Vercel编译失败(Edge Runtime动态代码评估错误)
核心原因
- Middleware触发Edge Runtime,错误加载Mongoose浏览器端包
Next.js的Middleware默认运行在Edge Runtime环境,你的middleware.ts间接引用了MongoDB连接模块。Mongoose会自动根据运行环境选择入口文件:Node.js环境加载核心包,而浏览器/Edge环境会加载browser.umd.js——这个包包含eval、new Function这类动态代码逻辑,Edge Runtime严格禁止这类操作,直接触发编译报错。本地开发时Middleware的Edge环境限制更宽松,所以未出现问题。 - Mongoose版本兼容性问题
你使用的Mongoose ^8.4.4版本,其浏览器端打包产物仍保留了Edge Runtime禁用的动态代码逻辑,导致在Edge环境下触发限制。
解决办法
- 避免Middleware直接/间接引用Mongoose
调整Middleware逻辑,不要让它调用MongoDB连接模块。如果必须在Middleware中操作数据库,改用兼容Edge Runtime的MongoDB官方mongodb驱动,或者将数据库操作移到Server Components、API Routes(这些默认运行在Node.js Runtime)。 - 强制Mongoose加载Node.js版本包
在next.config.js中添加配置,让Webpack强制解析Mongoose的Node.js入口,避免加载浏览器端umd包:module.exports = { webpack: (config) => { config.resolve.alias['mongoose'] = require.resolve('mongoose'); return config; }, }; - 调整Mongoose版本
尝试升级到Mongoose最新稳定版,或者降级到8.3.x这类已知兼容Edge Runtime的版本,新版本可能修复了浏览器端包的动态代码问题。 - 给Middleware指定Node.js Runtime
如果你的Middleware不需要Edge Runtime特性,在middleware.ts顶部添加注释,强制使用Node.js Runtime:export const runtime = 'nodejs';
内容的提问来源于stack exchange,提问作者Fauricio Valencia
相关产品推荐
相关产品推荐

