Jeden punkt wejścia, wszystkie middleware

Next.js daje Ci jeden plik middleware. NEMO pozwala dalej pisać małe, nazwane funkcje i rozdziela je po ścieżkach, dzięki czemu punkt wejścia zostaje tablicą tras, zamiast puchnąć do rozmiarów jednego wielkiego switcha.

GitHub
middleware.ts
import { createNEMO } from "@zanreal/nemo";

export const middleware = createNEMO({
  "/dashboard/:path*": [requireSession],
  "/api/:path*": [rateLimit, requireApiKey],
});

Rozwijane przez ZanReal w ramach programu OSS

NEMO to projekt firmowy, a nie czyjeś zajęcie po godzinach: pakiet, repozytorium i proces wydawniczy należą do ZanReal, a licencja pozostaje MIT. Co z tego wynika.

Niech przemówi kod

Ta sama logika rozdzielania ruchu: raz napisana ręcznie, raz na NEMO.

middleware.ts
import { NextResponse, type NextRequest } from "next/server";

export const middleware = async (req: NextRequest) => {
  let user = undefined;
  let team = undefined;
  const token = req.headers.get("token");

  if (req.nextUrl.pathname.startsWith("/auth")) {
    user = await getUserByToken(token);

    if (!user) {
      return NextResponse.redirect("/login");
    }

    return NextResponse.next();
  }

  if (req.nextUrl.pathname.startsWith("/team/") || req.nextUrl.pathname.startsWith("/t/")) {
    user = await getUserByToken(token);

    if (!user) {
      return NextResponse.redirect("/login");
    }

    team = await getTeamBySlug(req.nextUrl.searchParams.get("slug"));

    if (!team) {
      return NextResponse.redirect("/");
    }

    return NextResponse.next();
  }

  return NextResponse.next();
};
middleware.ts
import { createNEMO } from "@zanreal/nemo";
import { auth } from "@/app/(auth)/auth/_middleware";
import { team } from "@/app/(team)/team/_middleware";

const globalMiddlewares = {
  before: auth, // OR: [auth, ...]
};

const middlewares = {
  "/auth/:path*": auth,
  "/(team|t)/:slug/:path*": team, // OR: [team, ...]
};

export const middleware = createNEMO(middlewares, globalMiddlewares);

Każde if sprawdzające ścieżkę zamienia się w klucz. Same funkcje leżą przy trasach, których pilnują, a punkt wejścia przestaje rosnąć.

Zacznij porządki

Co potrafi

Segmenty dynamiczne

Uruchamiaj middleware na dowolnej trasie, również tej z segmentami dynamicznymi.

Łańcuchy funkcji

Podepnij pod jedną trasę kilka funkcji wykonywanych po kolei.

Wspólny kontekst

Funkcje w łańcuchu wymieniają się danymi przez wspólny storage.

Otwarty kod

Otwarte źródła

Czegoś brakuje? Dopisz to albo zgłoś issue na GitHubie.

Wygoda pracy

Otypowane od początku do końca, bez własnego kroku budowania i z API, które mieści się w głowie.

Chcesz pomóc?

Przejrzyj otwarte zgłoszenia albo przyślij pull request z tym, czego brakuje.

Pozostałe wersje

Każda wersja major ma własną dokumentację. v1 i v2 zostają opublikowane dla tych, którzy jeszcze nie podnieśli zależności.

Czy ta strona była pomocna?

M↓obsługiwane.