Next.js 15 Fullstack Web Apps · Lekcja

Ograniczanie częstotliwości żądań i obsługa błędów API

Chroń handlery tras Next.js za pomocą ograniczania częstotliwości żądań i zwracaj spójne, dobrze ustrukturyzowane odpowiedzi błędów z właściwymi kodami statusu HTTP.

Lekcja 4 z 413 kroki

Ograniczanie częstotliwości żądań i obsługa błędów API to bezpłatna lekcja Next.js 15 Fullstack Web Apps na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Next.js 15 Fullstack Web Apps, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Next.js 15 Fullstack Web Apps zawiera 4 lekcji w sumie.

Dlaczego warto ograniczać częstotliwość żądań

Publiczne trasy API są narażone na nadużycia: logowanie metodą brute force, scraping i przypadkowe zalewanie żądaniami. Ograniczanie częstotliwości ustala maksymalną liczbę żądań, które klient może wykonać w danym przedziale czasu, chroniąc backend i limity zewnętrznych usług.

Identyfikowanie klienta

Potrzebujesz klucza, aby zliczać żądania dla każdego klienta. Typowe opcje to adres IP, klucz API lub identyfikator uwierzytelnionego użytkownika. W handlerach tras odczytaj adres IP z nagłówków ustawianych przez platformę.

export async function GET(req) {
  const ip = req.headers.get('x-forwarded-for') ?? 'unknown';
  return Response.json({ ip });
}

Licznik stałego okna

Najprostszy algorytm zlicza żądania dla każdego klucza w stałym przedziale czasu. Gdy liczba żądań przekroczy limit, odrzucaj kolejne aż do zresetowania okna.

function fixedWindow(store, key, limit, windowMs) {
  const now = Date.now();
  const entry = store[key] || { count: 0, reset: now + windowMs };
  if (now > entry.reset) { entry.count = 0; entry.reset = now + windowMs; }
  entry.count++;
  store[key] = entry;
  return entry.count <= limit;
}

Wypróbowanie limitera

Uruchom lokalnie logikę stałego okna, aby zobaczyć, jak najpierw zezwala ona na żądania, a następnie je blokuje.

function fixedWindow(store, key, limit, windowMs) {
  const now = Date.now();
  const entry = store[key] || { count: 0, reset: now + windowMs };
  if (now > entry.reset) { entry.count = 0; entry.reset = now + windowMs; }
  entry.count++;
  store[key] = entry;
  return entry.count <= limit;
}
const store = {};
for (let i = 0; i < 4; i++) {
  console.log(i, fixedWindow(store, 'ip1', 3, 1000));
}

Pamięć lokalna a rozproszona

Magazyn w pamięci jest resetowany przy każdym zimnym starcie i nie jest współdzielony między instancjami serverless. W rzeczywistych wdrożeniach używaj współdzielonego magazynu, takiego jak Redis (np. Upstash), aby limity były spójne wszędzie.

Zwracanie 429

Gdy klient przekroczy limit, odpowiedz kodem HTTP 429 Too Many Requests i nagłówkiem Retry-After, informującym, kiedy można spróbować ponownie.

export async function POST(req) {
  if (!allowed) {
    return new Response('Rate limit exceeded', {
      status: 429,
      headers: { 'Retry-After': '60' },
    });
  }
  return Response.json({ ok: true });
}

Spójny format błędów

Klientom łatwiej analizować błędy, gdy każda awaria ma taki sam format JSON. Ustandaryzuj niewielką otoczkę odpowiedzi.

function apiError(message, status, code) {
  return Response.json(
    { error: { message, code } },
    { status }
  );
}

Mapowanie błędów na kody statusu

Wybierz status odpowiedni do przyczyny:

  • 400 nieprawidłowe dane wejściowe
  • 401 brak uwierzytelnienia
  • 403 brak autoryzacji
  • 404 nie znaleziono
  • 429 przekroczony limit częstotliwości
  • 500 błąd serwera

Przechwytywanie nieoczekiwanych błędów

Umieść logikę handlera w try/catch, aby nieobsłużony wyjątek został zamieniony na kontrolowany błąd 500, zamiast ujawniać ślad stosu.

export async function GET() {
  try {
    const data = await loadData();
    return Response.json(data);
  } catch (e) {
    console.error(e);
    return Response.json({ error: { message: 'Internal error' } }, { status: 500 });
  }
}

Wielokrotnego użytku wrapper

Wydziel powtarzalny kod do funkcji wyższego rzędu, która stosuje ograniczanie częstotliwości i przechwytywanie błędów do dowolnego handlera.

function withGuards(handler) {
  return async (req) => {
    if (!checkLimit(req)) return apiError('Too many requests', 429);
    try { return await handler(req); }
    catch { return apiError('Internal error', 500); }
  };
}

Nigdy nie ujawniaj szczegółów wewnętrznych

W środowisku produkcyjnym nigdy nie wysyłaj klientowi surowych komunikatów błędów, śladów stosu ani szczegółów SQL. Rejestruj je po stronie serwera i zwracaj ogólny komunikat ze stabilnym kodem błędu.

Szybkie sprawdzenie

Jaki kod statusu HTTP i jaki nagłówek najlepiej sygnalizują przekroczenie przez klienta limitu częstotliwości?

Podsumowanie

Zabezpieczyłeś trasy API:

  • Identyfikowałeś klientów i zliczałeś żądania za pomocą limitera stałego okna.
  • Zwracałeś 429 z Retry-After, preferując Redis do obsługi rozproszonych limitów.
  • Ustandaryzowałeś otoczkę błędów JSON i mapowałeś przyczyny na kody statusu.
  • Przechwytywałeś wyjątki i unikałeś ujawniania szczegółów wewnętrznych.
Bezpłatny start

Ucz się TypeScript dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
12
Lekcje
48

Często zadawane pytania

Czy lekcja „Ograniczanie częstotliwości żądań i obsługa błędów API” jest bezpłatna?

Tak — pełny tekst „Ograniczanie częstotliwości żądań i obsługa błędów API” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Next.js 15 Fullstack Web Apps, przejdź na CoddyKit PRO. Kurs Next.js 15 Fullstack Web Apps zawiera 4 lekcji w sumie.

Co nauczysz się w „Ograniczanie częstotliwości żądań i obsługa błędów API”?

Chroń handlery tras Next.js za pomocą ograniczania częstotliwości żądań i zwracaj spójne, dobrze ustrukturyzowane odpowiedzi błędów z właściwymi kodami statusu HTTP. Ćwiczysz Next.js 15 Fullstack Web Apps z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Next.js 15 Fullstack Web Apps?

Nie wymagamy żadnego doświadczenia. Next.js 15 Fullstack Web Apps w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Ograniczanie częstotliwości żądań i obsługa błędów API”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Next.js 15 Fullstack Web Apps?

Tak. Każda lekcja Next.js 15 Fullstack Web Apps zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie procedur obsługi tras API
  2. Walidacja żądań i bezpieczeństwo
  3. Integracja usług zewnętrznych
  4. Ograniczanie częstotliwości żądań i obsługa błędów API
← Powrót do Next.js 15 Fullstack Web Apps