Skip to content
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

Merged
merged 11 commits into from
Mar 9, 2024

Conversation

mattddean
Copy link
Contributor

@mattddean mattddean commented Nov 30, 2023

The value undefined can be saved to the incremental cache as undefined (JSON.stringify(undefined)) with no errors, but when retrieving it, we attempt to parse it as JSON using JSON.parse(undefined). This throws an error. We should instead deserialize undefined as undefined when retrieving.

relevant discussion: #59087

@mattddean mattddean changed the title Correctly deserialize undefined unstable_cache data. Correctly deserialize undefined unstable_cache data Nov 30, 2023
Copy link

@prasad-pul prasad-pul left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

Comment on lines 159 to 164
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
}
Copy link
Member

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) { ... } ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makes sense, updated

Copy link
Contributor Author

@mattddean mattddean Jan 22, 2024

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.stringifying the cache's data that could be undefined, then JSON.parseing it on retrieval persists, so I'm going to leave this PR open.

Copy link

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

@stabildev
Copy link

important!

@prasad-pul
Copy link

No idea why this isn't looked up by Next js team??

@samcx
Copy link
Member

samcx commented Feb 22, 2024

Taking a look!

@samcx
Copy link
Member

samcx commented Mar 8, 2024

Still looking into this everyone 🙇🏼

@mattddean
Copy link
Contributor Author

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.

@samcx
Copy link
Member

samcx commented Mar 8, 2024

@mattddean Yeah we should add a test. Let me see where we should

@samcx
Copy link
Member

samcx commented Mar 8, 2024

@mattddean You can add a directory called unstable_cache (similar to the no_store directory, but without the unstable_noStore) and add a 1-2 test(s) (one to test unstable_cache is working as expected, and another to test undefined) after the unstable_noStore` describe →

describe('unstable_noStore', () => {

Let me know if that helps!

@mattddean
Copy link
Contributor Author

@samcx Super helpful, thanks! Let me know if the tests I've added look sufficient to you.

@mattddean
Copy link
Contributor Author

Quick screenshot of the new test failing before applying this change:

Screenshot 2024-03-08 at 5 44 28 PM

@ijjk
Copy link
Member

ijjk commented Mar 9, 2024

Allow CI Workflow Run

  • approve CI run for commit: 7b5e8f0

Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer

2 similar comments
@ijjk
Copy link
Member

ijjk commented Mar 9, 2024

Allow CI Workflow Run

  • approve CI run for commit: 7b5e8f0

Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer

@ijjk
Copy link
Member

ijjk commented Mar 9, 2024

Allow CI Workflow Run

  • approve CI run for commit: 7b5e8f0

Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer

@ijjk
Copy link
Member

ijjk commented Mar 9, 2024

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
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 ⚠️ +924 B
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 ⚠️ +464 B
Overall change 105 kB 106 kB ⚠️ +464 B
Diff details
Diff for middleware.js

Diff too large to display

Commit: f510913

@ijjk
Copy link
Member

ijjk commented Mar 9, 2024

Tests Passed

@samcx samcx merged commit 6da6388 into vercel:canary Mar 9, 2024
61 checks passed
@Facundo-Martin
Copy link

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.
My solution was to just return null instead of undefined.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 27, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

8 participants