Nuxt 3中addServerMiddleware仅在开发环境生效、生产环境代理失效问题求助
你的问题核心在于Nuxt 3开发环境和生产环境的服务器引擎差异:开发模式基于Vite/Connect,能兼容Express风格的中间件(比如http-proxy-middleware),但生产环境使用的Nitro服务器基于h3框架,它不直接支持Express中间件,导致你的代理在生产环境无法生效。
下面提供两种可行的解决方案:
方案一:使用Nitro内置代理配置(推荐)
Nuxt 3的底层服务器Nitro已经内置了代理支持,不需要自定义模块,直接在nuxt.config.js中配置即可,同时覆盖开发和生产环境:
export default defineNuxtConfig({ // 其他配置... nitro: { // 开发环境代理 devProxy: { '/uploads': { target: 'http://localhost:1337/', changeOrigin: true, // 必要时添加,避免跨域问题 prependPath: false // 如果不需要把/uploads加到目标路径,可设置为false } }, // 生产环境代理 proxy: { '/uploads': { target: 'http://localhost:1337/', changeOrigin: true, prependPath: false } } } });
配置完成后,重新构建并运行生产服务器,代理就能正常工作了。
方案二:适配h3框架的自定义代理模块
如果你坚持要使用自定义模块,需要把Express风格的中间件替换为h3兼容的代理实现。可以使用h3-proxy这个包:
- 首先安装依赖:
npm install h3-proxy
- 修改你的代理模块代码:
import { addServerMiddleware, defineNuxtModule } from "@nuxt/kit"; import { createProxy } from "h3-proxy"; export default defineNuxtModule({ setup(options, nuxt) { addServerMiddleware({ path: '/uploads', handler: createProxy({ target: 'http://localhost:1337/', changeOrigin: true }) }); }, });
h3-proxy是专门为h3框架设计的代理工具,能在开发和生产环境都被Nitro正确识别和执行。
为什么原来的方法失效?
你之前的代码中,createProxyMiddleware是Express/Connect生态的中间件,而Nitro在生产环境使用的h3服务器采用了不同的请求处理模型,无法直接兼容Express中间件。虽然构建日志显示模块已运行,但生产服务器启动后无法加载这个不兼容的中间件,导致代理失效。
而addServerMiddleware在Nuxt 3中的行为和addPlugin不同:addPlugin是添加Vue/Nuxt插件,而addServerMiddleware需要根据运行环境提供对应兼容的中间件格式——开发环境支持Express,生产环境必须是h3兼容的中间件。
内容的提问来源于stack exchange,提问作者Aram Becker

