From bcb20100dbb6c6b43ecbc46e8ee8d236ad724f15 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 23 Feb 2023 16:55:58 +0100 Subject: [PATCH] Fix error on 404 page when middleware exists (#46303) Closes #44293. ## Bug - [ ] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Errors have a helpful link attached, see [`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md) ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] [e2e](https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs) tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see [`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md) ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) --- packages/next/src/shared/lib/router/router.ts | 8 ++++---- test/e2e/404-page-router/index.test.ts | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/next/src/shared/lib/router/router.ts b/packages/next/src/shared/lib/router/router.ts index 4a31ac69c10b..857288a96e20 100644 --- a/packages/next/src/shared/lib/router/router.ts +++ b/packages/next/src/shared/lib/router/router.ts @@ -1456,6 +1456,8 @@ export default class Router implements BaseRouter { Router.events.emit('routeChangeStart', as, routeProps) } + const isErrorRoute = this.pathname === '/404' || this.pathname === '/_error' + try { let routeInfo = await this.getRouteInfo({ route, @@ -1645,10 +1647,7 @@ export default class Router implements BaseRouter { // wasn't originally present. This is also why this block is before the // below `changeState` call which updates the browser's history (changing // the URL). - if ( - isQueryUpdating && - (this.pathname === '/404' || this.pathname === '/_error') - ) { + if (isQueryUpdating && isErrorRoute) { routeInfo = await this.getRouteInfo({ route: this.pathname, pathname: this.pathname, @@ -1658,6 +1657,7 @@ export default class Router implements BaseRouter { routeProps: { shallow: false }, locale: nextState.locale, isPreview: nextState.isPreview, + isQueryUpdating: isQueryUpdating && !this.isFallback, }) if ('type' in routeInfo) { diff --git a/test/e2e/404-page-router/index.test.ts b/test/e2e/404-page-router/index.test.ts index 6cde04efcf40..5c69e310cd77 100644 --- a/test/e2e/404-page-router/index.test.ts +++ b/test/e2e/404-page-router/index.test.ts @@ -118,5 +118,16 @@ describe.each(table)( } }) }) + + // It should not throw any errors when re-fetching the route info: + // https://github.com/vercel/next.js/issues/44293 + it('should not throw any errors when re-fetching the route info', async () => { + const browser = await webdriver(next.url, '/?test=1') + await check( + () => browser.eval('next.router.isReady ? "yes" : "no"'), + 'yes' + ) + expect(await browser.elementById('query').text()).toEqual('test=1') + }) } )