Skip to content

Commit 029b497

Browse files
authored
fix: set undefined ODB 404 TTLs to 60 seconds (#1647)
* fix: cache 404s for max 60 seconds * feat: add new demo page to test ISR returning notFound * test: update test snapshots with new page * chore: debug test errors * chore: update test debugging * fix: remove api call from new revalidate page
1 parent f5b293c commit 029b497

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Link from 'next/link'
2+
3+
const Show = () => (
4+
<div>
5+
<p>This page is ISR, but will return a 404 if the current time ends in 0-4.</p>
6+
7+
<Link href="/">
8+
<a>Go back home</a>
9+
</Link>
10+
</div>
11+
)
12+
13+
export async function getStaticProps(context) {
14+
return {
15+
props: {},
16+
notFound: new Date().getMinutes() % 10 < 5,
17+
revalidate: 60,
18+
}
19+
}
20+
21+
export default Show

packages/runtime/src/templates/getHandler.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,15 @@ const makeHandler = (conf: NextConfig, app, pageRoot, staticManifest: Array<[str
128128
const ttl = getMaxAge(cacheHeader)
129129
// Long-expiry TTL is basically no TTL, so we'll skip it
130130
if (ttl > 0 && ttl < ONE_YEAR_IN_SECONDS) {
131-
result.ttl = ttl
132-
requestMode = `odb ttl=${ttl}`
131+
// ODBs currently have a minimum TTL of 60 seconds
132+
result.ttl = Math.max(ttl, 60)
133+
}
134+
// Only cache 404s ephemerally
135+
if (ttl === ONE_YEAR_IN_SECONDS && result.statusCode === 404) {
136+
result.ttl = 60
137+
}
138+
if (result.ttl > 0) {
139+
requestMode = `odb ttl=${result.ttl}`
133140
}
134141
}
135142
multiValueHeaders['cache-control'] = ['public, max-age=0, must-revalidate']

test/__snapshots__/index.js.snap

+40
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ exports.resolvePages = () => {
2020
require.resolve('../../../.next/server/pages/getStaticProps/[id].js')
2121
require.resolve('../../../.next/server/pages/getStaticProps/env.js')
2222
require.resolve('../../../.next/server/pages/getStaticProps/static.js')
23+
require.resolve('../../../.next/server/pages/getStaticProps/with-revalidate-404.js')
2324
require.resolve('../../../.next/server/pages/getStaticProps/with-revalidate.js')
2425
require.resolve('../../../.next/server/pages/getStaticProps/withFallback/[...slug].js')
2526
require.resolve('../../../.next/server/pages/getStaticProps/withFallback/[id].js')
@@ -55,6 +56,7 @@ exports.resolvePages = () => {
5556
require.resolve('../../../.next/server/pages/getStaticProps/[id].js')
5657
require.resolve('../../../.next/server/pages/getStaticProps/env.js')
5758
require.resolve('../../../.next/server/pages/getStaticProps/static.js')
59+
require.resolve('../../../.next/server/pages/getStaticProps/with-revalidate-404.js')
5860
require.resolve('../../../.next/server/pages/getStaticProps/with-revalidate.js')
5961
require.resolve('../../../.next/server/pages/getStaticProps/withFallback/[...slug].js')
6062
require.resolve('../../../.next/server/pages/getStaticProps/withFallback/[id].js')
@@ -90,6 +92,7 @@ exports.resolvePages = () => {
9092
require.resolve('../../../web/.next/server/pages/getStaticProps/[id].js')
9193
require.resolve('../../../web/.next/server/pages/getStaticProps/env.js')
9294
require.resolve('../../../web/.next/server/pages/getStaticProps/static.js')
95+
require.resolve('../../../web/.next/server/pages/getStaticProps/with-revalidate-404.js')
9396
require.resolve('../../../web/.next/server/pages/getStaticProps/with-revalidate.js')
9497
require.resolve('../../../web/.next/server/pages/getStaticProps/withFallback/[...slug].js')
9598
require.resolve('../../../web/.next/server/pages/getStaticProps/withFallback/[id].js')
@@ -125,6 +128,7 @@ exports.resolvePages = () => {
125128
require.resolve('../../../web/.next/server/pages/getStaticProps/[id].js')
126129
require.resolve('../../../web/.next/server/pages/getStaticProps/env.js')
127130
require.resolve('../../../web/.next/server/pages/getStaticProps/static.js')
131+
require.resolve('../../../web/.next/server/pages/getStaticProps/with-revalidate-404.js')
128132
require.resolve('../../../web/.next/server/pages/getStaticProps/with-revalidate.js')
129133
require.resolve('../../../web/.next/server/pages/getStaticProps/withFallback/[...slug].js')
130134
require.resolve('../../../web/.next/server/pages/getStaticProps/withFallback/[id].js')
@@ -501,6 +505,12 @@ Array [
501505
"status": 200,
502506
"to": "/.netlify/functions/___netlify-handler",
503507
},
508+
Object {
509+
"force": true,
510+
"from": "/_next/data/build-id/en/getStaticProps/with-revalidate-404.json",
511+
"status": 200,
512+
"to": "/.netlify/builders/___netlify-odb-handler",
513+
},
504514
Object {
505515
"force": true,
506516
"from": "/_next/data/build-id/en/getStaticProps/with-revalidate.json",
@@ -723,6 +733,12 @@ Array [
723733
"status": 200,
724734
"to": "/.netlify/functions/___netlify-handler",
725735
},
736+
Object {
737+
"force": true,
738+
"from": "/_next/data/build-id/es/getStaticProps/with-revalidate-404.json",
739+
"status": 200,
740+
"to": "/.netlify/builders/___netlify-odb-handler",
741+
},
726742
Object {
727743
"force": true,
728744
"from": "/_next/data/build-id/es/getStaticProps/with-revalidate.json",
@@ -909,6 +925,12 @@ Array [
909925
"status": 200,
910926
"to": "/.netlify/functions/___netlify-handler",
911927
},
928+
Object {
929+
"force": true,
930+
"from": "/_next/data/build-id/fr/getStaticProps/with-revalidate-404.json",
931+
"status": 200,
932+
"to": "/.netlify/builders/___netlify-odb-handler",
933+
},
912934
Object {
913935
"force": true,
914936
"from": "/_next/data/build-id/fr/getStaticProps/with-revalidate.json",
@@ -1202,6 +1224,12 @@ Array [
12021224
"status": 200,
12031225
"to": "/.netlify/builders/___netlify-odb-handler",
12041226
},
1227+
Object {
1228+
"force": true,
1229+
"from": "/es/getStaticProps/with-revalidate-404",
1230+
"status": 200,
1231+
"to": "/.netlify/builders/___netlify-odb-handler",
1232+
},
12051233
Object {
12061234
"force": false,
12071235
"from": "/es/getStaticProps/withFallback/:id",
@@ -1394,6 +1422,12 @@ Array [
13941422
"status": 200,
13951423
"to": "/.netlify/builders/___netlify-odb-handler",
13961424
},
1425+
Object {
1426+
"force": true,
1427+
"from": "/fr/getStaticProps/with-revalidate-404",
1428+
"status": 200,
1429+
"to": "/.netlify/builders/___netlify-odb-handler",
1430+
},
13971431
Object {
13981432
"force": false,
13991433
"from": "/fr/getStaticProps/withFallback/:id",
@@ -1538,6 +1572,12 @@ Array [
15381572
"status": 200,
15391573
"to": "/.netlify/builders/___netlify-odb-handler",
15401574
},
1575+
Object {
1576+
"force": true,
1577+
"from": "/getStaticProps/with-revalidate-404",
1578+
"status": 200,
1579+
"to": "/.netlify/builders/___netlify-odb-handler",
1580+
},
15411581
Object {
15421582
"force": false,
15431583
"from": "/getStaticProps/withFallback/:id",

0 commit comments

Comments
 (0)