withastro/astro · error · AstroError

RenderUndefinedEntryError

RenderUndefinedEntryError

Error message

Attempted to render an undefined content collection entry.

What it means

Thrown by renderEntry() when called with a falsy entry. The data layer's render path requires a concrete DataEntry; passing undefined usually means an upstream lookup returned nothing (e.g. getEntry returned undefined) and the caller forwarded it to render without a null check.

Source

Thrown at packages/astro/src/content/runtime.ts:572

				ctx.update(src);
			}
		}
	});
	return copy;
}

export function resolveEntryData<T extends Record<string, unknown>>(
	entry: DataEntry<T>,
	imageAssetMap?: Map<string, ImageMetadata>,
): T {
	return entry.assetImports?.length
		? updateImageReferencesInData(entry.data, entry.filePath, imageAssetMap)
		: structuredClone(entry.data);
}

export async function renderEntry(entry: DataEntry) {
	if (!entry) {
		throw new AstroError(AstroErrorData.RenderUndefinedEntryError);
	}
	recordContentEntryRender(entry.filePath);

	if (entry.deferredRender) {
		try {
			// @ts-expect-error	virtual module
			const { default: contentModules } = await import('astro:content-module-imports');
			const renderEntryImport = contentModules.get(entry.filePath);
			return render({
				collection: '',
				id: entry.id,
				renderEntryImport,
			});
		} catch (e) {
			console.error(e);
		}
	}

View on GitHub (pinned to d081033d5f)

Solutions

  1. Null-check the entry before rendering: if (!entry) return Astro.redirect('/404').
  2. Validate that getEntry/getLiveEntry returned a value before calling its render.
  3. In dynamic routes, handle the not-found case explicitly (404) instead of forwarding undefined.

Example fix

// before
const entry = await getEntry('posts', params.slug);
const { Content } = await renderEntry(entry);
// after
const entry = await getEntry('posts', params.slug);
if (!entry) return Astro.redirect('/404');
const { Content } = await renderEntry(entry);
Defensive patterns

Strategy: type-guard

Validate before calling

async function renderOr404(entry: Awaited<ReturnType<typeof getEntry>>) {
  if (!entry) throw new Error('not found');
  return renderEntry(entry);
}

Type guard

const isDefinedEntry = <T>(e: T | undefined | null): e is T => e != null;

Prevention

When it happens

Trigger: Calling renderEntry(undefined) directly; passing the result of getEntry() to render() without checking for undefined: const e = await getEntry(...); const { render } = await renderEntry(e).

Common situations: Dynamic routes where the entry doesn't exist; typos in collection/id; race where the entry was deleted between fetch and render; refactors that drop a null check.

Related errors


AI-assisted analysis of withastro/astro@d081033d5f (2026-08-12). Data as JSON: /api/errors/9e05fa148128ce87. Report an issue: GitHub.