Zaawansowane dopasowywanie tras

Nie tylko kształt ścieżki: lista dopuszczalnych wartości parametru, wykluczanie konkretnych oraz wyrażenia regularne, gdy wzorzec nie wystarcza.

Sam kształt ścieżki to nie wszystko, co da się zapisać we wzorcu. Parametrowi można narzucić listę dopuszczalnych wartości, wykluczyć z niej konkretne albo opisać go pełnym wyrażeniem regularnym.

Ograniczenia parametrów

Lista dopuszczalnych wartości

Nawias tuż po nazwie parametru zawęża go do wypisanych wariantów, rozdzielonych pionową kreską:

const nemo = new NEMO({
  "/:lang(en|fr|es)/documentation": [
    (req) => {
      const { lang } = req.params;
      // lang will be either 'en', 'fr', or 'es'
      return NextResponse.next();
    },
  ],
});

Wzorzec przejdzie dla:

  • /en/documentation
  • /fr/documentation
  • /es/documentation

Odpadnie natomiast na:

  • /de/documentation
  • /jp/documentation

Wykluczanie wartości

Wykrzyknik odwraca warunek: parametr przyjmie wtedy wszystko poza wskazaną wartością.

const nemo = new NEMO({
  "/:section(!api)/details": [
    (req) => {
      const { section } = req.params;
      // section will be anything EXCEPT 'api'
      return NextResponse.next();
    },
  ],
});

Wzorzec przejdzie dla:

  • /products/details
  • /users/details
  • /settings/details

Odpadnie natomiast na:

  • /api/details

Kilka ograniczeń naraz

Warunki nakłada się niezależnie na każdy parametr, więc oba zapisy mogą stanąć w jednym wzorcu:

const nemo = new NEMO({
  "/:project/:env(dev|staging|prod)/:resource(!secrets)": [
    (req) => {
      const { project, env, resource } = req.params;
      // env will be either 'dev', 'staging', or 'prod'
      // resource will be anything EXCEPT 'secrets'
      return NextResponse.next();
    },
  ],
});

Przykłady

Trasy językowe

Typowe zastosowanie listy wariantów: middleware ma objąć wyłącznie wersje językowe, które rzeczywiście istnieją.

const nemo = new NEMO({
  "/:lang(en|cn)/blog/:postId": [
    // Only matches English and Chinese blog pages
    (req) => {
      const { lang, postId } = req.params;
      // lang will be either 'en' or 'cn'
      return NextResponse.next();
    },
  ],
});

Omijanie sekcji chronionych

Wykluczenia przydają się w drugą stronę: middleware ogólnego przeznaczenia nie powinno wchodzić w drogę panelowi administracyjnemu ani ustawieniom.

const nemo = new NEMO({
  "/:area(!admin|!settings)/:page": [
    // This middleware runs for any routes EXCEPT in admin or settings areas
    (req) => {
      const { area, page } = req.params;
      return NextResponse.next();
    },
  ],
});

Wyrażenia regularne

Gdy lista wariantów nie wystarcza, w nawiasie może stanąć pełne wyrażenie regularne. Poniższy wzorzec dopuszcza wyłącznie identyfikatory złożone z dokładnie pięciu cyfr:

const nemo = new NEMO({
  "/:id([0-9]{5})/profile": [
    // Only matches if id consists of exactly 5 digits
    (req) => {
      const { id } = req.params;
      return NextResponse.next();
    },
  ],
});

Czy ta strona była pomocna?

M↓obsługiwane.

Spis treści