-
-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(nextjs): Auto-include
pages/_error.js
(#140)
This adds another file to be copied into the user's project when they run the nextjs version of the wizard, specifically the `_error.js` page which the vercel folks include in their Sentry example app[1] in order to catch more errors. As they say in the comments of that file: ``` // Next.js will pass an err on the server if a page's data fetching methods // threw or returned a Promise that rejected // // Running on the client (browser), Next.js will provide an err if: // // - a page's `getInitialProps` threw or returned a Promise that rejected // - an exception was thrown somewhere in the React lifecycle (render, // componentDidMount, etc) that was caught by Next.js's React Error // Boundary. Read more about what types of exceptions are caught by Error // Boundaries: https://reactjs.org/docs/error-boundaries.html ``` Given that `_error.js` doesn't go at the root level of the project the way the others do, and given that users can either store their page files in `pages` or `src/pages`, I had to add some logic for computing the destination of each copied file. Also, since `_error.js` already starts with an underscore, I felt like adding an underscore to the front of our copy of a file in cases where the file already exists wasn't a great scheme anymore, so I changed to adding `wizardcopy` just before the file's extension (so, for example, if `next.config.js` already exists, we'll now create `next.config.wizardcopy.js`). (This has the added advantage that the real file and our copy now alphabetize right next to one another, so it's dead simple to find them for merging.) This change is added to the manual setup page in docs in getsentry/sentry-docs#4286. [1] https://github.com/vercel/next.js/blob/canary/examples/with-sentry/pages/_error.js
- Loading branch information
1 parent
2cde774
commit 1e9faf0
Showing
2 changed files
with
132 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
import NextErrorComponent from 'next/error'; | ||
|
||
import * as Sentry from '@sentry/nextjs'; | ||
|
||
const MyError = ({ statusCode, hasGetInitialPropsRun, err }) => { | ||
if (!hasGetInitialPropsRun && err) { | ||
// getInitialProps is not called in case of | ||
// https://github.com/vercel/next.js/issues/8592. As a workaround, we pass | ||
// err via _app.js so it can be captured | ||
Sentry.captureException(err); | ||
// Flushing is not required in this case as it only happens on the client | ||
} | ||
|
||
return <NextErrorComponent statusCode={statusCode} />; | ||
}; | ||
|
||
MyError.getInitialProps = async ({ res, err, asPath }) => { | ||
const errorInitialProps = await NextErrorComponent.getInitialProps({ | ||
res, | ||
err, | ||
}); | ||
|
||
// Workaround for https://github.com/vercel/next.js/issues/8592, mark when | ||
// getInitialProps has run | ||
errorInitialProps.hasGetInitialPropsRun = true; | ||
|
||
// Running on the server, the response object (`res`) is available. | ||
// | ||
// Next.js will pass an err on the server if a page's data fetching methods | ||
// threw or returned a Promise that rejected | ||
// | ||
// Running on the client (browser), Next.js will provide an err if: | ||
// | ||
// - a page's `getInitialProps` threw or returned a Promise that rejected | ||
// - an exception was thrown somewhere in the React lifecycle (render, | ||
// componentDidMount, etc) that was caught by Next.js's React Error | ||
// Boundary. Read more about what types of exceptions are caught by Error | ||
// Boundaries: https://reactjs.org/docs/error-boundaries.html | ||
|
||
if (err) { | ||
Sentry.captureException(err); | ||
|
||
// Flushing before returning is necessary if deploying to Vercel, see | ||
// https://vercel.com/docs/platform/limits#streaming-responses | ||
await Sentry.flush(2000); | ||
|
||
return errorInitialProps; | ||
} | ||
|
||
// If this point is reached, getInitialProps was called without any | ||
// information about what the error might be. This is unexpected and may | ||
// indicate a bug introduced in Next.js, so record it in Sentry | ||
Sentry.captureException( | ||
new Error(`_error.js getInitialProps missing data at path: ${asPath}`), | ||
); | ||
await Sentry.flush(2000); | ||
|
||
return errorInitialProps; | ||
}; | ||
|
||
export default MyError; |