From 4002f4b33c5a42166e5ad5f9ff4f879195aeb852 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Wed, 21 Feb 2024 00:34:22 -0800 Subject: [PATCH] Fix draft mode invariant (#62121) ### What? In today's implementation, requests that don't end in `.rsc` are getting the data request query. We need to remove this toggle to prevent them from 500'ing. ### Why? The invariant triggered was: https://github.com/vercel/next.js/blob/212553958c671ea1f71d96fbc97ea4b9e5019bf3/packages/next/src/server/base-server.ts#L2838-L2842 Crawling up the code, the conditional: https://github.com/vercel/next.js/blob/212553958c671ea1f71d96fbc97ea4b9e5019bf3/packages/next/src/server/base-server.ts#L2815 must be `true`. The variable `isDataReq` is set here: https://github.com/vercel/next.js/blob/212553958c671ea1f71d96fbc97ea4b9e5019bf3/packages/next/src/server/base-server.ts#L1833-L1839 This conditional expression is a bit complex, but it simplifies down to: - `isDataReq` is `true` when (TODO) - `isDataReq` is `false` when (TODO) ### How? Closes NEXT-2341 Fixes #61377 Tested manually by: - Building and packaging this branch locally - Deploying tarball and then depending on it as the Next.js version for an example app similar to the one reported by #61377 - Inspecting console for 500 errors. --------- Co-authored-by: JJ Kasper Co-authored-by: Zack Tanner --- packages/next/src/server/base-server.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts index 16072e62ec073..6d88305c19e88 100644 --- a/packages/next/src/server/base-server.ts +++ b/packages/next/src/server/base-server.ts @@ -2810,7 +2810,11 @@ export default abstract class Server { res.setHeader(NEXT_DID_POSTPONE_HEADER, '1') } - if (isDataReq) { + // we don't go through this block when preview mode is true + // as preview mode is a dynamic request (bypasses cache) and doesn't + // generate both HTML and payloads in the same request so continue to just + // return the generated payload + if (isDataReq && !isPreviewMode) { // If this is a dynamic RSC request, then stream the response. if (isDynamicRSCRequest) { if (cachedData.pageData) {