diff --git a/packages/next/next-server/server/next-server.ts b/packages/next/next-server/server/next-server.ts index 8c81cd18a8e9a..2026e6f613209 100644 --- a/packages/next/next-server/server/next-server.ts +++ b/packages/next/next-server/server/next-server.ts @@ -1123,28 +1123,31 @@ export default class Server { let result: null | LoadComponentsReturnType = null const { static404, pages404 } = this.nextConfig.experimental + const is404 = res.statusCode === 404 let using404Page = false // use static 404 page if available and is 404 response - if (static404 && res.statusCode === 404) { - try { - result = await this.findPageComponents('/_errors/404') - } catch (err) { - if (err.code !== 'ENOENT') { - throw err + if (is404) { + if (static404) { + try { + result = await this.findPageComponents('/_errors/404') + } catch (err) { + if (err.code !== 'ENOENT') { + throw err + } } } - } - // use 404 if /_errors/404 isn't available which occurs - // during development and when _app has getInitialProps - if (!result && pages404) { - try { - result = await this.findPageComponents('/404') - using404Page = true - } catch (err) { - if (err.code !== 'ENOENT') { - throw err + // use 404 if /_errors/404 isn't available which occurs + // during development and when _app has getInitialProps + if (!result && pages404) { + try { + result = await this.findPageComponents('/404') + using404Page = true + } catch (err) { + if (err.code !== 'ENOENT') { + throw err + } } } } diff --git a/test/integration/404-page/pages/err.js b/test/integration/404-page/pages/err.js new file mode 100644 index 0000000000000..938b5e49ac296 --- /dev/null +++ b/test/integration/404-page/pages/err.js @@ -0,0 +1,5 @@ +const page = () => 'custom 404 page' +page.getInitialProps = () => { + throw new Error('oops') +} +export default page diff --git a/test/integration/404-page/test/index.test.js b/test/integration/404-page/test/index.test.js index 5208f99d9b080..e6c28cee3871a 100644 --- a/test/integration/404-page/test/index.test.js +++ b/test/integration/404-page/test/index.test.js @@ -42,6 +42,12 @@ const runTests = (mode = 'server') => { expect(await res.text()).toContain('custom 404 page') }) + it('should render _error for a 500 error still', async () => { + const html = await renderViaHTTP(appPort, '/err') + expect(html).not.toContain('custom 404 page') + expect(html).toContain(mode === 'dev' ? 'oops' : 'Internal Server Error') + }) + if (mode !== 'dev') { it('should output _errors/404.html during build', async () => { expect(