-
Notifications
You must be signed in to change notification settings - Fork 26.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Correctly deserialize undefined
unstable_cache data
#59126
Conversation
undefined
unstable_cache data.undefined
unstable_cache data
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good!
if (cacheEntry) { | ||
const resData = cacheEntry.value.data | ||
cachedValue = JSON.parse(resData.body) | ||
// JSON.stringify(undefined) returns `undefined`, but JSON.parse(undefined) throws an error | ||
cachedValue = | ||
resData.body !== undefined ? JSON.parse(resData.body) : undefined | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we also just move this entire condition below if (isStale) { ... }
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
makes sense, updated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unstable_cache was refactored, but the issue of JSON.stringify
ing the cache's data that could be undefined
, then JSON.parse
ing it on retrieval persists, so I'm going to leave this PR open.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure why is this not being merged or reviewed yet by NextJs team 🤔
Isn't this a critical bug, when an api returns undefined
the unstable_cache
crashes the Application. Isn't that a very common scenario??
Issue #59124
cc: @mattddean , @ijjk , @timneutkens
important! |
No idea why this isn't looked up by Next js team?? |
Taking a look! |
Still looking into this everyone 🙇🏼 |
Happy to help if I can! Or to write a failing test if you point me at the right directory to put it in. |
@mattddean Yeah we should add a test. Let me see where we should |
@mattddean You can add a directory called
Let me know if that helps! |
@samcx Super helpful, thanks! Let me know if the tests I've added look sufficient to you. |
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
2 similar comments
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
Stats from current PRDefault Build (Increase detected
|
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
buildDuration | 13.6s | 13.6s | N/A |
buildDurationCached | 7.3s | 6.1s | N/A |
nodeModulesSize | 198 MB | 198 MB | |
nextStartRea..uration (ms) | 429ms | 433ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
2453-HASH.js gzip | 30.5 kB | 30.5 kB | N/A |
3304.HASH.js gzip | 181 B | 181 B | ✓ |
3f784ff6-HASH.js gzip | 53.7 kB | 53.7 kB | N/A |
8299-HASH.js gzip | 5.04 kB | 5.04 kB | N/A |
framework-HASH.js gzip | 45.2 kB | 45.2 kB | ✓ |
main-app-HASH.js gzip | 242 B | 242 B | ✓ |
main-HASH.js gzip | 32.2 kB | 32.2 kB | N/A |
webpack-HASH.js gzip | 1.68 kB | 1.68 kB | N/A |
Overall change | 45.6 kB | 45.6 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
_app-HASH.js gzip | 196 B | 197 B | N/A |
_error-HASH.js gzip | 184 B | 184 B | ✓ |
amp-HASH.js gzip | 505 B | 505 B | ✓ |
css-HASH.js gzip | 324 B | 325 B | N/A |
dynamic-HASH.js gzip | 2.5 kB | 2.5 kB | N/A |
edge-ssr-HASH.js gzip | 258 B | 258 B | ✓ |
head-HASH.js gzip | 352 B | 352 B | ✓ |
hooks-HASH.js gzip | 370 B | 371 B | N/A |
image-HASH.js gzip | 4.21 kB | 4.21 kB | ✓ |
index-HASH.js gzip | 259 B | 259 B | ✓ |
link-HASH.js gzip | 2.67 kB | 2.67 kB | N/A |
routerDirect..HASH.js gzip | 314 B | 312 B | N/A |
script-HASH.js gzip | 386 B | 386 B | ✓ |
withRouter-HASH.js gzip | 309 B | 309 B | ✓ |
1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
Overall change | 6.57 kB | 6.57 kB | ✓ |
Client Build Manifests
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
_buildManifest.js gzip | 481 B | 484 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
index.html gzip | 529 B | 529 B | ✓ |
link.html gzip | 541 B | 542 B | N/A |
withRouter.html gzip | 524 B | 523 B | N/A |
Overall change | 529 B | 529 B | ✓ |
Edge SSR bundle Size
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
edge-ssr.js gzip | 95.1 kB | 95.1 kB | N/A |
page.js gzip | 3.07 kB | 3.07 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 624 B | 624 B | ✓ |
middleware-r..fest.js gzip | 151 B | 151 B | ✓ |
middleware.js gzip | 25.5 kB | 25.5 kB | N/A |
edge-runtime..pack.js gzip | 839 B | 839 B | ✓ |
Overall change | 1.61 kB | 1.61 kB | ✓ |
Next Runtimes
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
app-page-exp...dev.js gzip | 171 kB | 171 kB | ✓ |
app-page-exp..prod.js gzip | 96.5 kB | 96.5 kB | ✓ |
app-page-tur..prod.js gzip | 98.3 kB | 98.3 kB | ✓ |
app-page-tur..prod.js gzip | 92.7 kB | 92.7 kB | ✓ |
app-page.run...dev.js gzip | 149 kB | 149 kB | ✓ |
app-page.run..prod.js gzip | 91.2 kB | 91.2 kB | ✓ |
app-route-ex...dev.js gzip | 21.3 kB | 21.3 kB | ✓ |
app-route-ex..prod.js gzip | 15 kB | 15 kB | ✓ |
app-route-tu..prod.js gzip | 15 kB | 15 kB | ✓ |
app-route-tu..prod.js gzip | 14.8 kB | 14.8 kB | ✓ |
app-route.ru...dev.js gzip | 21 kB | 21 kB | ✓ |
app-route.ru..prod.js gzip | 14.8 kB | 14.8 kB | ✓ |
pages-api-tu..prod.js gzip | 9.52 kB | 9.52 kB | ✓ |
pages-api.ru...dev.js gzip | 9.8 kB | 9.8 kB | ✓ |
pages-api.ru..prod.js gzip | 9.52 kB | 9.52 kB | ✓ |
pages-turbo...prod.js gzip | 22.3 kB | 22.3 kB | ✓ |
pages.runtim...dev.js gzip | 22.9 kB | 22.9 kB | ✓ |
pages.runtim..prod.js gzip | 22.3 kB | 22.3 kB | ✓ |
server.runti..prod.js gzip | 50.5 kB | 50.5 kB | ✓ |
Overall change | 948 kB | 948 kB | ✓ |
build cache Overall increase ⚠️
vercel/next.js canary | mattddean/next.js patch-2 | Change | |
---|---|---|---|
0.pack gzip | 1.56 MB | 1.55 MB | N/A |
index.pack gzip | 105 kB | 106 kB | |
Overall change | 105 kB | 106 kB |
Diff details
Diff for middleware.js
Diff too large to display
Tests Passed |
Haha just ran into this bug today at work. It's nice to see it's been fixed! Although just for the canary version I guess. |
The value
undefined
can be saved to the incremental cache asundefined
(JSON.stringify(undefined)
) with no errors, but when retrieving it, we attempt to parse it as JSON usingJSON.parse(undefined)
. This throws an error. We should instead deserializeundefined
asundefined
when retrieving.relevant discussion: #59087