From 3d52f4d84358274f6548e66050012e9137cd90a7 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Fri, 12 Nov 2021 15:45:39 +0100 Subject: [PATCH] fix test --- .../next-middleware-ssr-loader/index.ts | 31 +++++++++++++------ .../app/pages/500.js | 3 -- .../test/index.test.js | 11 +++++++ 3 files changed, 33 insertions(+), 12 deletions(-) delete mode 100644 test/integration/react-streaming-and-server-components/app/pages/500.js diff --git a/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts b/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts index 41b8be61d0bf906..10b69c24ce24142 100644 --- a/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts +++ b/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts @@ -41,7 +41,6 @@ export default async function middlewareRSCLoader(this: any) { import App from ${stringifiedAbsoluteAppPath} import Document from ${stringifiedAbsoluteDocumentPath} - let ErrorPage try { ErrorPage = require(${stringified500PagePath}).default @@ -172,6 +171,7 @@ export default async function middlewareRSCLoader(this: any) { const writer = transformStream.writable.getWriter() const encoder = new TextEncoder() let result + let renderError let statusCode = 200 try { result = await renderToHTML( @@ -182,15 +182,28 @@ export default async function middlewareRSCLoader(this: any) { renderOpts ) } catch (err) { + renderError = err statusCode = 500 - const errorRes = { statusCode, err } - result = await renderToHTML( - req, - errorRes, - pathname, - query, - { ...renderOpts, Component: ErrorPage } - ) + } + if (renderError) { + try { + const errorRes = { statusCode, err: renderError } + result = await renderToHTML( + req, + errorRes, + pathname, + query, + { ...renderOpts, Component: ErrorPage } + ) + } catch (err) { + return new Response( + (err || 'An error occurred while rendering ' + pathname + '.').toString(), + { + status: 500, + headers: { 'x-middleware-ssr': '1' } + } + ) + } } result.pipe({ diff --git a/test/integration/react-streaming-and-server-components/app/pages/500.js b/test/integration/react-streaming-and-server-components/app/pages/500.js deleted file mode 100644 index 2e6a4c7bc95353e..000000000000000 --- a/test/integration/react-streaming-and-server-components/app/pages/500.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function Page500() { - return 'custom-500-page' -} diff --git a/test/integration/react-streaming-and-server-components/test/index.test.js b/test/integration/react-streaming-and-server-components/test/index.test.js index 5bd7d097e78b36e..371953a331b90ed 100644 --- a/test/integration/react-streaming-and-server-components/test/index.test.js +++ b/test/integration/react-streaming-and-server-components/test/index.test.js @@ -24,6 +24,7 @@ const nativeModuleTestAppDir = join(__dirname, '../unsupported-native-module') const distDir = join(__dirname, '../app/.next') const documentPage = new File(join(appDir, 'pages/_document.jsx')) const appPage = new File(join(appDir, 'pages/_app.js')) +const error500Page = new File(join(appDir, 'pages/500.js')) const documentWithGip = ` import { Html, Head, Main, NextScript } from 'next/document' @@ -55,6 +56,12 @@ function App({ Component, pageProps }) { export default App ` +const page500 = ` +export default function Page500() { + return 'custom-500-page' +} +` + async function nextBuild(dir) { return await _nextBuild(dir, [], { stdout: true, @@ -100,11 +107,13 @@ describe('concurrentFeatures - prod', () => { const context = { appDir } beforeAll(async () => { + error500Page.write(page500) context.appPort = await findPort() await nextBuild(context.appDir) context.server = await nextStart(context.appDir, context.appPort) }) afterAll(async () => { + error500Page.delete() await killApp(context.server) }) @@ -155,10 +164,12 @@ describe('concurrentFeatures - dev', () => { const context = { appDir } beforeAll(async () => { + error500Page.write(page500) context.appPort = await findPort() context.server = await nextDev(context.appDir, context.appPort) }) afterAll(async () => { + error500Page.delete() await killApp(context.server) })