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 übertrieben großzügig. app/menu/[slug]/page.jsx passt auf /menu/pizza und genauso problemlos auf /menu/asdfgh und rendert dann eine dish-Seite für ein dish, das gar nicht existiert.

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

1. Der 404-Bildschirm. Eine Datei namens not-found.jsx, die demselben Club spezieller Dateinamen angehört wie page.jsx und layout.jsx:

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

Platzieren Sie es unter app/not-found.jsx, und es deckt die gesamte App ab: Jede URL, die mit nichts übereinstimmt, landet hier, anstatt auf der einfachen integrierten 404-Seite.

2. Der Auslöser. Manchmal passt die URL zu einer Route, aber die Daten existieren nicht. Das ist der Fall bei /menu/asdfgh, und nur Ihr Code kann das erkennen. Rufen Sie 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 Sie rufen nicht return dafür auf: Der Aufruf stoppt die Seite genau dort und zeigt das nächstgelegene not-found.jsx an. Alles nach dem if kann sicher davon ausgehen, dass das dish existiert, weshalb der Guard ganz oben steht.

challenge icon

Aufgabe

Mittel

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

  1. Erstelle app/not-found.jsx. Default-exportiere 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 dishes-Array 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