Skip to content

Commit

Permalink
fix: skip hooks for server fetch to prerendered routes
Browse files Browse the repository at this point in the history
Doing a server-side `fetch()` (e.g. `isSubRequest: true`) to a route
that is prerendered runs `hooks.server.js`,
which is different behaviour from a normal `fetch()`.
  • Loading branch information
aloisklink committed Jan 24, 2025
1 parent 708af70 commit 3ed5527
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/nine-llamas-fetch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: skip hooks for server fetch to prerendered routes
8 changes: 8 additions & 0 deletions packages/kit/src/runtime/server/fetch.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade
return await fetch(request);
}

if (manifest._.prerendered_routes.has(decoded)) {
// the prerendered logic is different for each adapter,
// (except maybe for prerendered redirects)
// so we need to make an actual HTTP request
// We do it here to avoid calling server-side hooks for prerendered routes
return await fetch(request);
}

if (credentials !== 'omit') {
const cookie = get_cookie_header(url, request.headers.get('cookie'));
if (cookie) {
Expand Down
2 changes: 1 addition & 1 deletion packages/kit/src/runtime/server/respond.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ export async function respond(request, options, manifest, state) {
return text('Not found', { status: 404, headers });
}

if (!state.prerendering?.fallback && !manifest._.prerendered_routes.has(decoded)) {
if (!state.prerendering?.fallback) {
// TODO this could theoretically break — should probably be inside a try-catch
const matchers = await manifest._.matchers();

Expand Down
10 changes: 10 additions & 0 deletions packages/kit/test/apps/basics/src/hooks.server.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { building, dev } from '$app/environment';
import { error, isHttpError, redirect } from '@sveltejs/kit';
import { sequence } from '@sveltejs/kit/hooks';
import fs from 'node:fs';
Expand Down Expand Up @@ -136,6 +137,15 @@ export const handle = sequence(

return resolve(event);
},
async ({ event, resolve }) => {
if (!dev && !building && event.url.pathname === '/prerendering/prerendered-endpoint/api') {
error(
500,
`Server hooks should not be called for prerendered endpoints: isSubRequest=${event.isSubRequest}`
);
}
return resolve(event);
},
async ({ event, resolve }) => {
if (['/non-existent-route', '/non-existent-route-loop'].includes(event.url.pathname)) {
event.locals.url = new URL(event.request.url);
Expand Down

0 comments on commit 3ed5527

Please sign in to comment.