002ReviewseniorTypeScript / Next.js真实来源改编 Next.js
Next.js Middleware:修复子请求递归导致的重复执行
审查一个给 middleware 入口加早退分支的小补丁,作者说它避免了框架子请求触发 middleware 重复执行、重复重定向。
@@ -8,6 +8,15 @@ const protectedRoutes = ['/admin', '/billing', '/settings'] export function middleware(req: NextRequest) {+ // Framework subrequests already passed through middleware once. Next.js+ // tags them with x-middleware-subrequest, so short-circuit here to avoid+ // re-running auth on the same request chain (fixes duplicate redirects).+ if (req.headers.get('x-middleware-subrequest')) {+ return NextResponse.next()+ }+ const pathname = req.nextUrl.pathname const requiresAuth = protectedRoutes.some((route) => pathname.startsWith(route)) if (!requiresAuth) { return NextResponse.next() }@@ -18,6 +18,15 @@ test('redirects anonymous users away from admin pages', () => { const res = middleware(req) expect(res.status).toBe(307) }) +test('does not re-run middleware on framework subrequests', () => {+ const req = makeRequest('/admin')+ req.headers.set('x-middleware-subrequest', 'middleware')+ const res = middleware(req)+ // Subrequest is allowed straight through instead of redirecting again.+ expect(res.status).toBe(200)+})+ test('allows requests to public routes', () => { const req = makeRequest('/pricing') const res = middleware(req)