sveltejs/kit · error

Cannot prerender a +server file with ${BODY_DEPENDENT_METHOD

Error message

Cannot prerender a +server file with ${BODY_DEPENDENT_METHODS.join(', ')} handlers (${route.id})

What it means

Prerendering executes handlers at build time, where no request body exists. If a +server.js sets `export const prerender = true` but also defines POST/PUT/PATCH/DELETE handlers (methods that depend on the request body), SvelteKit throws because those handlers cannot be meaningfully prerendered.

Source

Thrown at packages/kit/src/core/postbuild/analyse.js:184

	}

	return { metadata };
}

/**
 * @param {import('types').SSRRoute} route
 * @param {import('types').SSREndpoint} mod
 */
function analyse_endpoint(route, mod) {
	validate_server_exports(mod, route.id);

	if (
		mod.prerender &&
		/** @type {import('types').HttpMethod[]} */ (BODY_DEPENDENT_METHODS).some(
			(method) => mod[method]
		)
	) {
		throw new Error(
			`Cannot prerender a +server file with ${BODY_DEPENDENT_METHODS.join(', ')} handlers (${route.id})`
		);
	}

	/** @type {Array<import('types').HttpMethod | '*'>} */
	const methods = [];

	for (const method of /** @type {import('types').HttpMethod[]} */ (ENDPOINT_METHODS)) {
		if (mod[method]) methods.push(method);
	}

	if (mod.fallback) {
		methods.push('*');
	}

	return {
		config: mod.config,
		entries: mod.entries,

View on GitHub (pinned to 03f1687fe6)

Solutions

  1. Remove `export const prerender = true` from the +server.js file.
  2. Exclude the endpoint from inherited prerender by adding `export const prerender = false;` in that +server.js.
  3. If global prerender is on, restructure so body-dependent endpoints are outside the prerendered subtree.

Example fix

// before (+server.js)
export const prerender = true;
export const POST = async ({ request }) => { ... };
// after (+server.js)
export const prerender = false;
export const POST = async ({ request }) => { ... };
Defensive patterns

Strategy: validation

Validate before calling

const src = await fs.readFile('src/routes/api/+server.js', 'utf8');
const hasPrerender = /export\s+const\s+prerender\s*=\s*true/.test(src);
const bodyMethods = ['POST', 'PUT', 'PATCH', 'DELETE'].filter((m) =>
  new RegExp(`export\\s+(async\\s+)?function\\s+${m}|export\\s+const\\s+${m}`).test(src)
);
if (hasPrerender && bodyMethods.length) {
  throw new Error(`Cannot prerender +server with ${bodyMethods.join(', ')} handlers`);
}

Try / catch

try {
  await build();
} catch (e) {
  if (String(e.message).includes('Cannot prerender a +server file')) {
    console.error('Disable prerender on this endpoint (export const prerender = false):', e.message);
  } else throw e;
}

Prevention

When it happens

Trigger: A +server.js with `export const POST = ...` (or PUT/PATCH/DELETE) plus `export const prerender = true`, or inheriting truthy prerender from kit config / a parent +layout.js while defining body-dependent methods.

Common situations: Enabling prerender globally (`prerender: { handleHttpError: ... }` with a blanket `export const prerender = true` in root +layout.js) while API routes with POST handlers live under the same route tree; adding prerender to an API route by copy-paste.

Related errors


AI-assisted analysis of sveltejs/kit@03f1687fe6 (2026-09-02). Data as JSON: /api/errors/f110bf261b054725. Report an issue: GitHub.