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

Next.js中间件匹配所有路由时遇Unexpected token '<'错误求助

问题修复方案

错误原因

当不配置matcher时,中间件会拦截所有请求,包括Next.js的静态资源(如/_next/static/下的JS/CSS)、图片优化接口、favicon.ico等。这些请求不需要进行角色校验,且getToken在这类请求上无法正确解析出有效JWT,甚至会导致响应被意外修改为HTML内容,浏览器尝试将HTML当作JS解析时,就会抛出Uncaught SyntaxError: Unexpected token '<'错误。

修复方案

不需要手动将所有页面添加到matcher数组,以下两种方法都能解决问题:

方法1:优化matcher规则,排除静态资源

通过否定匹配模式,让中间件只作用于页面路由,自动跳过静态资源请求:

export const config = {
  matcher: [
    // 匹配所有路径,除了以下开头的资源
    '/((?!_next/static|_next/image|favicon.ico).*)',
  ],
}

方法2:在中间件内部跳过静态资源处理

在中间件逻辑开头添加判断,直接放行静态资源请求:

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { getToken } from 'next-auth/jwt'

export async function middleware(request: NextRequest) {
  // 跳过静态资源和图标请求
  if (request.nextUrl.pathname.startsWith('/_next/') || request.nextUrl.pathname === '/favicon.ico') {
    return NextResponse.next()
  }

  const token = await getToken({
    req: request,
    secret: process.env.JWT_SECRET
  }) as any
  if (token !== null && token.user.role === "admin") {
    if (request.nextUrl.pathname.startsWith('/admin')) {
      return NextResponse.next()
    } else {
      return NextResponse.redirect(new URL('/admin', request.url))
    }
  }
}

总结

两种方案都能避免中间件干扰静态资源请求,同时保证页面路由的角色校验逻辑正常运行,无需手动维护所有页面路径的matcher数组。

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:07:49