From 3c6989f08f86482c8121344944679f5431263172 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 27 Jun 2022 17:41:28 -0500 Subject: [PATCH 1/2] Fix resolving dynamic routes when on returns a redirect --- packages/next/server/base-server.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index f4d3187d3f157..dcf9da4f077de 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -1830,8 +1830,7 @@ export default abstract class Server { // Ensure a request to the URL /accounts/[id] will be treated as a dynamic // route correctly and not loaded immediately without parsing params. if (!isDynamicRoute(page)) { - const result = await this.renderPageComponent(ctx, bubbleNoFallback) - if (result) return result + return await this.renderPageComponent(ctx, bubbleNoFallback) } if (this.dynamicRoutes) { @@ -1841,7 +1840,7 @@ export default abstract class Server { continue } page = dynamicRoute.page - const result = await this.renderPageComponent( + return await this.renderPageComponent( { ...ctx, pathname: page, @@ -1852,7 +1851,6 @@ export default abstract class Server { }, bubbleNoFallback ) - if (result) return result } } } catch (error) { From 4cc286440faeb52230e4246c9ce4701ca9083785 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 27 Jun 2022 18:00:53 -0500 Subject: [PATCH 2/2] Update fix and add test case --- packages/next/server/base-server.ts | 8 +++--- test/production/required-server-files.test.ts | 27 +++++++++++++++++++ .../pages/route-resolving/[slug]/[project].js | 3 +++ .../pages/route-resolving/import/[slug].js | 19 +++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 test/production/required-server-files/pages/route-resolving/[slug]/[project].js create mode 100644 test/production/required-server-files/pages/route-resolving/import/[slug].js diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index dcf9da4f077de..4a2f448732b08 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -1815,7 +1815,7 @@ export default abstract class Server { } } } - return null + return false } private async renderToResponse( @@ -1830,7 +1830,8 @@ export default abstract class Server { // Ensure a request to the URL /accounts/[id] will be treated as a dynamic // route correctly and not loaded immediately without parsing params. if (!isDynamicRoute(page)) { - return await this.renderPageComponent(ctx, bubbleNoFallback) + const result = await this.renderPageComponent(ctx, bubbleNoFallback) + if (result !== false) return result } if (this.dynamicRoutes) { @@ -1840,7 +1841,7 @@ export default abstract class Server { continue } page = dynamicRoute.page - return await this.renderPageComponent( + const result = await this.renderPageComponent( { ...ctx, pathname: page, @@ -1851,6 +1852,7 @@ export default abstract class Server { }, bubbleNoFallback ) + if (result !== false) return result } } } catch (error) { diff --git a/test/production/required-server-files.test.ts b/test/production/required-server-files.test.ts index b376f71065677..57df9fe6cd144 100644 --- a/test/production/required-server-files.test.ts +++ b/test/production/required-server-files.test.ts @@ -138,6 +138,33 @@ describe('should set-up next', () => { if (server) await killApp(server) }) + it('should resolve correctly when a redirect is returned', async () => { + const toRename = `standalone/.next/server/pages/route-resolving/[slug]/[project].html` + await next.renameFile(toRename, `${toRename}.bak`) + try { + const res = await fetchViaHTTP( + appPort, + '/route-resolving/import/first', + undefined, + { + redirect: 'manual', + headers: { + 'x-matched-path': '/route-resolving/import/[slug]', + }, + } + ) + expect(res.status).toBe(307) + expect(new URL(res.headers.get('location'), 'http://n').pathname).toBe( + '/somewhere' + ) + + await waitFor(3000) + expect(stderr).not.toContain('ENOENT') + } finally { + await next.renameFile(`${toRename}.bak`, toRename) + } + }) + it('should show invariant when an automatic static page is requested', async () => { const toRename = `standalone/.next/server/pages/auto-static.html` await next.renameFile(toRename, `${toRename}.bak`) diff --git a/test/production/required-server-files/pages/route-resolving/[slug]/[project].js b/test/production/required-server-files/pages/route-resolving/[slug]/[project].js new file mode 100644 index 0000000000000..02d5d992f2396 --- /dev/null +++ b/test/production/required-server-files/pages/route-resolving/[slug]/[project].js @@ -0,0 +1,3 @@ +export default function Page(props) { + return

/[slug]/[project]

+} diff --git a/test/production/required-server-files/pages/route-resolving/import/[slug].js b/test/production/required-server-files/pages/route-resolving/import/[slug].js new file mode 100644 index 0000000000000..d86b7db97c88b --- /dev/null +++ b/test/production/required-server-files/pages/route-resolving/import/[slug].js @@ -0,0 +1,19 @@ +export default function Page(props) { + return

/import/[slug]

+} + +export function getStaticProps() { + return { + redirect: { + destination: '/somewhere', + permanent: false, + }, + } +} + +export function getStaticPaths() { + return { + paths: [], + fallback: true, + } +}