如何让Nuxt3全局中间件在nuxt-link跳转时触发维护模式?
问题原因及解决方案
问题原因
你直接通过process.env.MAINTENANCE获取环境变量,但Nuxt3的规则是:未以NUXT_PUBLIC_为前缀的环境变量不会暴露给客户端。
- 页面刷新时属于服务端渲染,服务端能读取到
process.env.MAINTENANCE,所以中间件正常触发重定向; - 通过
nuxt-link跳转属于客户端导航,此时process.env.MAINTENANCE在客户端环境中是undefined,导致中间件执行到if (!isMaintenance) return;时直接退出,不执行后续重定向逻辑。
解决方案
1. 修改环境变量命名
更新~/.env文件,给维护模式变量加上NUXT_PUBLIC_前缀,确保客户端能访问到:
NUXT_PUBLIC_MAINTENANCE=true
2. 调整中间件代码
使用Nuxt提供的useRuntimeConfig()方法获取客户端可访问的环境变量,替代直接读取process.env:
export default defineNuxtRouteMiddleware((to, from) => { const config = useRuntimeConfig(); const isMaintenance = config.public.MAINTENANCE; const allowedRoutes = [ '/status/maintenance', '/legal/imprint' ]; if (!isMaintenance) return; if (isMaintenance === 'true' && !allowedRoutes.includes(to.path)) { return navigateTo('/status/maintenance'); } else if (isMaintenance === 'false' && to.path === '/status/maintenance') { return navigateTo('/'); } })
3. 重启开发服务
修改环境变量后,需要重启Nuxt开发服务,确保新的环境变量生效。
调整完成后,无论是页面刷新还是客户端路由跳转,全局中间件都会正确读取维护模式状态并执行对应的重定向逻辑。
内容的提问来源于stack exchange,提问作者Daveoffic
相关产品推荐
相关产品推荐

