Next.js 15-fullstackwebapps · Lektion

Rate limiting og API-fejlhåndtering

Beskyt Deres Next.js route handlers med rate limiting, og returnér ensartede, velstrukturerede fejlresponser med korrekte HTTP-statuskoder.

Lektion 4 af 413 trin

Rate limiting og API-fejlhåndtering er en gratis Next.js 15-fullstackwebapps-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Next.js 15-fullstackwebapps, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Next.js 15-fullstackwebapps-kurset indeholder 4 lektioner i alt.

Hvorfor begrænse hastigheden

Offentlige API-ruter er udsat for misbrug: brute-force-login, scraping og utilsigtede oversvømmelser. Hastighedsbegrænsning sætter et loft over, hvor mange forespørgsler en klient må sende i et tidsinterval, og beskytter din backend samt kvoter hos eksterne tjenester.

Identifikation af klienten

Du skal bruge en nøgle til at tælle forespørgsler pr. klient. Almindelige valg er IP-adressen, en API-nøgle eller den godkendte bruger-ID. I rutehåndteringer læser du IP-adressen fra headere, som din platform har angivet.

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

En tæller med fast tidsvindue

Den enkleste algoritme tæller forespørgsler pr. nøgle i et fast tidsvindue. Når antallet overskrider grænsen, afvises yderligere forespørgsler, indtil vinduet nulstilles.

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;
}

Afprøvning af begrænseren

Kør logikken for det faste tidsvindue lokalt for at se, hvordan den først tillader og derefter blokerer.

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));
}

I hukommelsen kontra distribueret

Et lager i hukommelsen nulstilles ved hver kold start og deles ikke mellem serverløse instanser. Brug et delt lager som Redis (f.eks. Upstash) til rigtige installationer, så grænserne er ens overalt.

Returnering af 429

Når en klient overskrider grænsen, skal du svare med HTTP 429 Too Many Requests og en Retry-After-header, der fortæller, hvornår klienten kan prøve igen.

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

En ensartet fejlstruktur

Klienter fortolker fejl lettere, når hver fejl har samme JSON-struktur. Standardisér en lille indpakning.

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

Knytning af fejl til statuskoder

Vælg den status, der passer til årsagen:

  • 400 ugyldige inputdata
  • 401 ikke godkendt
  • 403 ikke autoriseret
  • 404 ikke fundet
  • 429 hastighedsbegrænset
  • 500 serverfejl

Opfangning af uventede fejl

Indpak håndteringslogikken i try/catch, så en ubehandlet undtagelse bliver til en kontrolleret 500 i stedet for et lækket stack trace.

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 });
  }
}

Genanvendelig indpakning

Udtræk standardkoden til en higher-order-funktion, der anvender hastighedsbegrænsning og fejlopsamling på enhver håndtering.

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); }
  };
}

Læk aldrig interne oplysninger

I produktion må du aldrig sende rå fejlmeddelelser, stack traces eller SQL-oplysninger til klienten. Log dem på serversiden, og returnér en generisk meddelelse med en stabil fejlkode.

Hurtigt tjek

Hvilken HTTP-statuskode og header signalerer bedst, at en klient har overskredet hastighedsgrænsen?

Opsummering

Du har sikret dine API-ruter:

  • Identificeret klienter og talt forespørgsler med en begrænser med fast tidsvindue.
  • Returneret 429 med Retry-After og foretrukket Redis til distribuerede grænser.
  • Standardiseret en JSON-fejlindpakning og knyttet årsager til statuskoder.
  • Opfanget undtagelser og undgået at lække interne oplysninger.
Gratis at komme i gang

Lær TypeScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Rate limiting og API-fejlhåndtering” gratis?

Ja — alle 3 lektioner i læringssporet Next.js 15-fullstackwebapps, inklusive “Rate limiting og API-fejlhåndtering”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Next.js 15-fullstackwebapps-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Rate limiting og API-fejlhåndtering”?

Beskyt Deres Next.js route handlers med rate limiting, og returnér ensartede, velstrukturerede fejlresponser med korrekte HTTP-statuskoder. Du øver dig i Next.js 15-fullstackwebapps med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Next.js 15-fullstackwebapps?

Der kræves ingen tidligere erfaring. Next.js 15-fullstackwebapps på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Rate limiting og API-fejlhåndtering”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Next.js 15-fullstackwebapps-lektion?

Ja. Alle Next.js 15-fullstackwebapps-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Opbygning af API-routehandlers
  2. Validering af requests og sikkerhed
  3. Integration af eksterne tjenester
  4. Rate limiting og API-fejlhåndtering
← Tilbage til Next.js 15-fullstackwebapps