Menu
Coddy logo textTech

Nicht-gefunden-Seiten

Teil des Abschnitts Next.js Essentials der React-Journey von Coddy. Lektion 9 von 47.

Eine dynamische Route ist geradezu übermäßig großzügig. app/menu/[slug]/page.jsx entspricht /menu/pizza und genauso bereitwillig /menu/asdfgh und rendert dann eine Gerichtseite für ein Gericht, das nicht existiert.

Next.js bietet dir beide Hälften der Lösung.

1. Der 404-Bildschirm. Eine Datei namens not-found.jsx, derselben Gruppe spezieller Dateinamen wie page.jsx und layout.jsx zugehörig:

// app/not-found.jsx
export default function NotFound() {
    return <h1>We don't have that</h1>;
}

Lege sie unter app/not-found.jsx ab; sie gilt für die gesamte app: Jede URL, die auf nichts passt, landet hier statt auf der einfachen integrierten 404-Seite.

2. Der Auslöser. Manchmal stimmt die URL mit einer Route überein, aber die Daten existieren nicht. Das ist der Fall /menu/asdfgh, und nur dein Code kann das feststellen. Rufe notFound() auf:

import { notFound } from 'next/navigation';

const dishes = ['pizza', 'pasta'];

export default async function Dish({ params }) {
    const { slug } = await params;

    if (!dishes.includes(slug)) {
        notFound();
    }

    return <h1>{slug}</h1>;
}

notFound() gibt keinen Wert zurück, und du gibst es nicht zurück: Sein Aufruf stoppt die Seite genau dort und zeigt die nächstgelegene not-found.jsx an. Alles nach dem if kann sicher davon ausgehen, dass das Gericht tatsächlich existiert – deshalb steht die Prüfung ganz oben.

challenge icon

Aufgabe

Mittel

/menu/sushi rendert derzeit eine Gerichtseite für ein Gericht, das nicht auf der Speisekarte steht. Schließe diese Lücke.

  1. Vervollständige die Datei app/not-found.jsx. Exportiere standardmäßig eine Komponente, die ein <h1> mit id="not-found-title" und dem exakten Text Dish not found zurückgibt.
  2. Importiere in app/menu/[slug]/page.jsx notFound aus next/navigation.
  3. Wenn slug nicht im Array dishes enthalten ist, rufe notFound() auf, bevor irgendetwas gerendert wird.

/menu/pizza muss weiterhin funktionieren.

Probier es selbst

import './globals.css';

export const metadata = {
    title: 'My App',
};

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                {children}
            </body>
        </html>
    );
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Next.js Essentials