From 58033c4a3ce3e08fdde17b653fb1cae96338eb3c Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 27 Jun 2022 18:47:32 -0500 Subject: [PATCH] Fix resolving dynamic routes when on returns a redirect (#38079) * Fix resolving dynamic routes when on returns a redirect * Update fix and add test case --- packages/next/server/base-server.ts | 6 ++--- 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, 52 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 f4d3187d3f15..4a2f448732b0 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( @@ -1831,7 +1831,7 @@ export default abstract class Server { // route correctly and not loaded immediately without parsing params. if (!isDynamicRoute(page)) { const result = await this.renderPageComponent(ctx, bubbleNoFallback) - if (result) return result + if (result !== false) return result } if (this.dynamicRoutes) { @@ -1852,7 +1852,7 @@ export default abstract class Server { }, bubbleNoFallback ) - if (result) return result + 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 b376f7106567..57df9fe6cd14 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 000000000000..02d5d992f239 --- /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 000000000000..d86b7db97c88 --- /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, + } +}