Skip to content

Commit 69f8024

Browse files
authoredJul 6, 2022
Call Error.getInitialProps for the top level error (#21240)
* fix: Call Error.getInitialProps to pass `err` * test: Call Error.getInitialPropsfoe the top level error * test: Update build output limit * test: Add tests for top level error * Revert "test: Call Error.getInitialPropsfoe the top level error" This reverts commit 81fa0c3. * test: Fix failing test
1 parent 708688d commit 69f8024

File tree

7 files changed

+105
-1
lines changed

7 files changed

+105
-1
lines changed
 

‎packages/next/client/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ function renderError(renderErrorProps: RenderErrorProps): Promise<any> {
521521
},
522522
}
523523
return Promise.resolve(
524-
renderErrorProps.props
524+
renderErrorProps.props?.err
525525
? renderErrorProps.props
526526
: loadGetInitialProps(App, appCtx)
527527
).then((initProps) =>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const Error = ({ message }) => {
2+
return <p id="error-p">Error Rendered with: {message}</p>
3+
}
4+
5+
Error.getInitialProps = ({ err }) => {
6+
return {
7+
message: err && err.message,
8+
}
9+
}
10+
11+
export default Error
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
if (typeof window !== 'undefined') {
2+
throw new Error('top level error')
3+
}
4+
5+
const Page = () => 'page'
6+
7+
export default Page
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/* eslint-env jest */
2+
3+
import { nextBuild, nextServer, startApp, stopApp } from 'next-test-utils'
4+
import webdriver from 'next-webdriver'
5+
import { join } from 'path'
6+
7+
jest.setTimeout(1000 * 60 * 2)
8+
9+
let appPort
10+
let app
11+
let server
12+
13+
describe('Top Level Error', () => {
14+
beforeAll(async () => {
15+
const appDir = join(__dirname, '../')
16+
await nextBuild(appDir)
17+
app = nextServer({
18+
dir: appDir,
19+
dev: false,
20+
quiet: true,
21+
})
22+
23+
server = await startApp(app)
24+
appPort = server.address().port
25+
})
26+
afterAll(() => stopApp(server))
27+
28+
it('should render error page with getInitialProps', async () => {
29+
const browser = await webdriver(appPort, '/')
30+
try {
31+
const text = await browser.waitForElementByCss('#error-p').text()
32+
expect(text).toBe('Error Rendered with: top level error')
33+
} finally {
34+
await browser.close()
35+
}
36+
})
37+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const Error = () => {
2+
return <p id="error-p">Error Rendered</p>
3+
}
4+
5+
export default Error
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
if (typeof window !== 'undefined') {
2+
throw new Error('top level error')
3+
}
4+
5+
const Page = () => 'page'
6+
7+
export default Page
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/* eslint-env jest */
2+
3+
import { nextBuild, nextServer, startApp, stopApp } from 'next-test-utils'
4+
import webdriver from 'next-webdriver'
5+
import { join } from 'path'
6+
7+
jest.setTimeout(1000 * 60 * 2)
8+
9+
let appPort
10+
let app
11+
let server
12+
13+
describe('Top Level Error', () => {
14+
beforeAll(async () => {
15+
const appDir = join(__dirname, '../')
16+
await nextBuild(appDir)
17+
app = nextServer({
18+
dir: appDir,
19+
dev: false,
20+
quiet: true,
21+
})
22+
23+
server = await startApp(app)
24+
appPort = server.address().port
25+
})
26+
afterAll(() => stopApp(server))
27+
28+
it('should render error page', async () => {
29+
const browser = await webdriver(appPort, '/')
30+
try {
31+
const text = await browser.waitForElementByCss('#error-p').text()
32+
expect(text).toBe('Error Rendered')
33+
} finally {
34+
await browser.close()
35+
}
36+
})
37+
})

0 commit comments

Comments
 (0)
Please sign in to comment.