Next.js中同时使用next-intl与NextAuth中间件的导出报错解决方案咨询
Next.js中同时使用next-intl与NextAuth中间件的导出报错解决方案咨询
你遇到的问题其实是Next.js中间件的核心机制导致的——一个middleware.js文件里只能有一个默认导出的中间件函数,同时next-intl的中间件确实需要被作为中间件逻辑执行,而不是单纯导出变量。
先理清楚你踩过的坑:
- 直接写两个
export default:违反ES模块的规范,一个模块只能有一个默认导出,所以报错A module cannot have multiple default exports.完全合理。 - 改成导出命名变量:Next.js的中间件系统只会识别默认导出的函数作为中间件入口,你导出的
intlMiddleware和authMiddleware不会被自动执行,所以next-intl的逻辑没跑起来,才会出现Cannot read properties of undefined (reading 'substring')的报错。
正确的解决方法:把两个中间件串联起来
我们需要创建一个组合中间件函数,让请求依次经过NextAuth和next-intl的中间件(顺序可以根据你的需求调整),然后把这个组合函数作为默认导出。
代码示例如下:
import createMiddleware from "next-intl/middleware"; import { routing } from "./i18n/routing"; import NextAuth from "next-auth"; import { authConfig } from "./auth.config"; // 初始化两个独立的中间件 const intlMiddleware = createMiddleware(routing); const authMiddleware = NextAuth(authConfig).auth; // 组合中间件:先执行认证,再处理国际化 export default function middleware(req) { // 先让请求经过NextAuth认证中间件,如果认证逻辑返回了响应(比如重定向登录),直接返回 const authResponse = authMiddleware(req); if (authResponse) return authResponse; // 认证通过后,再交给国际化中间件处理 return intlMiddleware(req); } export const config = { // 匹配需要处理的路径,保持你原来的规则即可 matcher: ["/", "/(en|ar)/:path*"], };
如果你的业务逻辑需要先处理国际化再做认证,只需要调换两个中间件的执行顺序:
export default function middleware(req) { const intlResponse = intlMiddleware(req); if (intlResponse) return intlResponse; return authMiddleware(req); }
补充说明
- Next.js的中间件本质是一个接收
NextRequest并返回NextResponse | undefined的函数,所以我们可以手动控制多个中间件的执行流程。 - 每个中间件如果返回了
NextResponse(比如重定向、修改响应头),后续的中间件就不会再执行,所以顺序很重要,根据你的业务需求调整即可。
备注:内容来源于stack exchange,提问作者Morgana Freeman
相关产品推荐
相关产品推荐

