You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中同时使用next-intl与NextAuth中间件的导出报错解决方案咨询

Next.js中同时使用next-intl与NextAuth中间件的导出报错解决方案咨询

你遇到的问题其实是Next.js中间件的核心机制导致的——一个middleware.js文件里只能有一个默认导出的中间件函数,同时next-intl的中间件确实需要被作为中间件逻辑执行,而不是单纯导出变量。

先理清楚你踩过的坑:

  1. 直接写两个export default:违反ES模块的规范,一个模块只能有一个默认导出,所以报错A module cannot have multiple default exports.完全合理。
  2. 改成导出命名变量: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:09:38