diff --git a/.changeset/stale-dogs-rule.md b/.changeset/stale-dogs-rule.md new file mode 100644 index 000000000000..cf8b47578063 --- /dev/null +++ b/.changeset/stale-dogs-rule.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Return 404 when fetching missing data during prerender diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index a8ffc66630d0..bb383f85fd82 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -259,6 +259,10 @@ export async function respond(request, options, state = {}) { }); } + if (state.prerender) { + return new Response('not found', { status: 404 }); + } + // we can't load the endpoint from our own manifest, // so we need to make an actual HTTP request return await fetch(request); diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js index 1aca3f4eb4da..296128a6eecd 100644 --- a/packages/kit/src/runtime/server/page/load_node.js +++ b/packages/kit/src/runtime/server/page/load_node.js @@ -190,7 +190,8 @@ export async function load_node({ response = await respond(new Request(new URL(requested, event.url).href, opts), options, { fetched: requested, - initiator: route + initiator: route, + prerender: state.prerender }); if (state.prerender) { diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte new file mode 100644 index 000000000000..b44cf77ecfc1 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte @@ -0,0 +1,17 @@ + + + + +

status: {status}

diff --git a/packages/kit/test/prerendering/basics/test/test.js b/packages/kit/test/prerendering/basics/test/test.js index f25fc416b356..5e3cd192c565 100644 --- a/packages/kit/test/prerendering/basics/test/test.js +++ b/packages/kit/test/prerendering/basics/test/test.js @@ -109,4 +109,9 @@ test('prerendering is set to true in global code of hooks.js', () => { assert.ok(content.includes('

prerendering: true/true

'), content); }); +test('fetching missing content results in a 404', () => { + const content = read('fetch-404.html'); + assert.ok(content.includes('

status: 404

'), content); +}); + test.run();