diff --git a/packages/next/next-server/server/next-server.ts b/packages/next/next-server/server/next-server.ts index 307ba5a6d5..7a0eb6dd95 100644 --- a/packages/next/next-server/server/next-server.ts +++ b/packages/next/next-server/server/next-server.ts @@ -774,9 +774,8 @@ export default class Server { // Toggle whether or not this is an SPR Data request const isSprData = isSpr && query._nextSprData - if (isSprData) { - delete query._nextSprData - } + delete query._nextSprData + // Compute the SPR cache key const sprCacheKey = parseUrl(req.url || '').pathname! @@ -890,7 +889,9 @@ export default class Server { req, res, pathname, - query, + result.unstable_getStaticProps + ? { _nextSprData: query._nextSprData } + : query, result, { ...this.renderOpts, amphtml, hasAmp, dataOnly } ) diff --git a/packages/next/server/next-dev-server.ts b/packages/next/server/next-dev-server.ts index 2fc0d8a974..fa7cf15917 100644 --- a/packages/next/server/next-dev-server.ts +++ b/packages/next/server/next-dev-server.ts @@ -414,13 +414,8 @@ export default class DevServer extends Server { continue } - // eslint-disable-next-line no-loop-func - return this.hotReloader!.ensurePage(dynamicRoute.page).then(() => { - pathname = dynamicRoute.page - query = Object.assign({}, query, params) - }) + return this.hotReloader!.ensurePage(dynamicRoute.page) } - throw err }) } catch (err) { diff --git a/test/integration/prerender/pages/blog/[post]/index.js b/test/integration/prerender/pages/blog/[post]/index.js index cb11f7ae32..7d44195d3b 100644 --- a/test/integration/prerender/pages/blog/[post]/index.js +++ b/test/integration/prerender/pages/blog/[post]/index.js @@ -27,6 +27,7 @@ export async function unstable_getStaticProps({ params }) { return { props: { + params, post: params.post, time: (await import('perf_hooks')).performance.now(), }, @@ -34,11 +35,12 @@ export async function unstable_getStaticProps({ params }) { } } -export default ({ post, time }) => { +export default ({ post, time, params }) => { return ( <>

Post: {post}

time: {time} +
{JSON.stringify(params)}
{JSON.stringify(useRouter().query)}
to home diff --git a/test/integration/prerender/pages/something.js b/test/integration/prerender/pages/something.js index af6e396167..afa6fdbde2 100644 --- a/test/integration/prerender/pages/something.js +++ b/test/integration/prerender/pages/something.js @@ -1,22 +1,26 @@ import React from 'react' import Link from 'next/link' +import { useRouter } from 'next/router' // eslint-disable-next-line camelcase -export async function unstable_getStaticProps() { +export async function unstable_getStaticProps({ params }) { return { props: { world: 'world', + params: params || {}, time: new Date().getTime(), }, revalidate: false, } } -export default ({ world, time }) => { +export default ({ world, time, params }) => { return ( <>

hello: {world}

time: {time} +
{JSON.stringify(params)}
+
{JSON.stringify(useRouter().query)}
to home diff --git a/test/integration/prerender/test/index.test.js b/test/integration/prerender/test/index.test.js index a8d50e157a..a884d17589 100644 --- a/test/integration/prerender/test/index.test.js +++ b/test/integration/prerender/test/index.test.js @@ -3,6 +3,7 @@ import fs from 'fs-extra' import { join } from 'path' import webdriver from 'next-webdriver' +import cheerio from 'cheerio' import { renderViaHTTP, fetchViaHTTP, @@ -190,6 +191,24 @@ const runTests = (dev = false) => { expect(html).toMatch(/Post:.*?post-1/) }) + it('should not supply query values to params or useRouter non-dynamic page SSR', async () => { + const html = await renderViaHTTP(appPort, '/something?hello=world') + const $ = cheerio.load(html) + const query = $('#query').text() + expect(JSON.parse(query)).toEqual({}) + const params = $('#params').text() + expect(JSON.parse(params)).toEqual({}) + }) + + it('should not supply query values to params or useRouter dynamic page SSR', async () => { + const html = await renderViaHTTP(appPort, '/blog/post-1?hello=world') + const $ = cheerio.load(html) + const params = $('#params').text() + expect(JSON.parse(params)).toEqual({ post: 'post-1' }) + const query = $('#query').text() + expect(JSON.parse(query)).toEqual({ post: 'post-1' }) + }) + it('should return data correctly', async () => { const data = JSON.parse( await renderViaHTTP(