Skip to content

Bun bietet native APIs für die Arbeit mit HTTP-Cookies durch Bun.Cookie und Bun.CookieMap. Diese APIs bieten schnelle, einfach zu verwendende Methoden zum Parsen, Generieren und Manipulieren von Cookies in HTTP-Anfragen und -Antworten.

CookieMap-Klasse

Bun.CookieMap bietet eine Map-ähnliche Schnittstelle für die Arbeit mit Cookie-Sammlungen. Sie implementiert das Iterable-Interface, sodass Sie sie mit for...of-Schleifen und anderen Iterationsmethoden verwenden können.

cookies.ts
ts
// Leere Cookie-Map
const cookies = new Bun.CookieMap();

// Aus einem Cookie-String
const cookies1 = new Bun.CookieMap("name=value; foo=bar");

// Aus einem Objekt
const cookies2 = new Bun.CookieMap({
  session: "abc123",
  theme: "dark",
});

// Aus einem Array von Name/Wert-Paaren
const cookies3 = new Bun.CookieMap([
  ["session", "abc123"],
  ["theme", "dark"],
]);

In HTTP-Servern

In Buns HTTP-Server ist die cookies-Eigenschaft des Anfrageobjekts (in routes) eine Instanz von CookieMap:

server.ts
ts
const server = Bun.serve({
  routes: {
    "/": req => {
      // Auf Anfrage-Cookies zugreifen
      const cookies = req.cookies;

      // Ein bestimmtes Cookie abrufen
      const sessionCookie = cookies.get("session");
      if (sessionCookie != null) {
        console.log(sessionCookie);
      }

      // Überprüfen, ob ein Cookie existiert
      if (cookies.has("theme")) {
        // ...
      }

      // Ein Cookie setzen, es wird automatisch auf die Antwort angewendet
      cookies.set("visited", "true");

      return new Response("Hello");
    },
  },
});

console.log("Server hört auf: " + server.url);

Methoden

get(name: string): string | null

Ruft ein Cookie nach Namen ab. Gibt null zurück, wenn das Cookie nicht existiert.

get-cookie.ts
ts
// Nach Name abrufen
const cookie = cookies.get("session");

if (cookie != null) {
  console.log(cookie);
}

has(name: string): boolean

Überprüft, ob ein Cookie mit dem angegebenen Namen existiert.

has-cookie.ts
ts
// Überprüfen, ob Cookie existiert
if (cookies.has("session")) {
  // Cookie existiert
}

set(name: string, value: string): void

set(options: CookieInit): void

Fügt ein Cookie zur Map hinzu oder aktualisiert es. Cookies standardmäßig auf { path: "/", sameSite: "lax" }.

set-cookie.ts
ts
// Nach Name und Wert setzen
cookies.set("session", "abc123");

// Mit Options-Objekt setzen
cookies.set({
  name: "theme",
  value: "dark",
  maxAge: 3600,
  secure: true,
});

// Mit Cookie-Instanz setzen
const cookie = new Bun.Cookie("visited", "true");
cookies.set(cookie);

delete(name: string): void

delete(options: CookieStoreDeleteOptions): void

Entfernt ein Cookie aus der Map. Bei Anwendung auf eine Response wird ein Cookie mit einem leeren String-Wert und einem Ablaufdatum in der Vergangenheit hinzugefügt. Ein Cookie wird im Browser nur erfolgreich gelöscht, wenn Domain und Pfad dieselben sind wie bei der Erstellung des Cookies.

delete-cookie.ts
ts
// Nach Name mit Standard-Domain und -Pfad löschen
cookies.delete("session");

// Mit Domain/Pfad-Optionen löschen
cookies.delete({
  name: "session",
  domain: "example.com",
  path: "/admin",
});

toJSON(): Record<string, string>

Konvertiert die Cookie-Map in ein serialisierbares Format.

cookie-to-json.ts
ts
const json = cookies.toJSON();

toSetCookieHeaders(): string[]

Gibt ein Array von Werten für Set-Cookie-Header zurück, die verwendet werden können, um alle Cookie-Änderungen anzuwenden.

Bei Verwendung von Bun.serve() müssen Sie diese Methode nicht explizit aufrufen. Alle Änderungen an der req.cookies-Map werden automatisch auf die Response-Header angewendet. Diese Methode ist hauptsächlich nützlich bei der Arbeit mit anderen HTTP-Server-Implementierungen.

node-server.js
js
import { createServer } from "node:http";
import { CookieMap } from "bun";

const server = createServer((req, res) => {
  const cookieHeader = req.headers.cookie || "";
  const cookies = new CookieMap(cookieHeader);

  cookies.set("view-count", Number(cookies.get("view-count") || "0") + 1);
  cookies.delete("session");

  res.writeHead(200, {
    "Content-Type": "text/plain",
    "Set-Cookie": cookies.toSetCookieHeaders(),
  });
  res.end(`Found ${cookies.size} cookies`);
});

server.listen(3000, () => {
  console.log("Server running at http://localhost:3000/");
});

Iteration

CookieMap bietet mehrere Methoden für die Iteration:

iterate-cookies.ts
ts
// Über [name, cookie]-Einträge iterieren
for (const [name, value] of cookies) {
  console.log(`${name}: ${value}`);
}

// Mit entries() verwenden
for (const [name, value] of cookies.entries()) {
  console.log(`${name}: ${value}`);
}

// Mit keys() verwenden
for (const name of cookies.keys()) {
  console.log(name);
}

// Mit values() verwenden
for (const value of cookies.values()) {
  console.log(value);
}

// Mit forEach verwenden
cookies.forEach((value, name) => {
  console.log(`${name}: ${value}`);
});

Eigenschaften

size: number

Gibt die Anzahl der Cookies in der Map zurück.

cookie-size.ts
ts
console.log(cookies.size); // Anzahl der Cookies

Bun.Cookie repräsentiert ein HTTP-Cookie mit seinem Namen, Wert und Attributen.

cookie-class.ts
ts
import { Cookie } from "bun";

// Ein grundlegendes Cookie erstellen
const cookie = new Bun.Cookie("name", "value");

// Ein Cookie mit Optionen erstellen
const secureSessionCookie = new Bun.Cookie("session", "abc123", {
  domain: "example.com",
  path: "/admin",
  expires: new Date(Date.now() + 86400000), // 1 Tag
  httpOnly: true,
  secure: true,
  sameSite: "strict",
});

// Aus einem Cookie-String parsen
const parsedCookie = new Bun.Cookie("name=value; Path=/; HttpOnly");

// Aus einem Options-Objekt erstellen
const objCookie = new Bun.Cookie({
  name: "theme",
  value: "dark",
  maxAge: 3600,
  secure: true,
});

Konstruktoren

constructors.ts
ts
// Grundlegender Konstruktor mit Name/Wert
new Bun.Cookie(name: string, value: string);

// Konstruktor mit Name, Wert und Optionen
new Bun.Cookie(name: string, value: string, options: CookieInit);

// Konstruktor aus Cookie-String
new Bun.Cookie(cookieString: string);

// Konstruktor aus Cookie-Objekt
new Bun.Cookie(options: CookieInit);

Eigenschaften

cookie-properties.ts
ts
cookie.name; // string - Cookie-Name
cookie.value; // string - Cookie-Wert
cookie.domain; // string | null - Domain-Geltungsbereich (null wenn nicht angegeben)
cookie.path; // string - URL-Pfad-Geltungsbereich (standardmäßig "/")
cookie.expires; // number | undefined - Ablaufzeitstempel (ms seit Epoch)
cookie.secure; // boolean - HTTPS erforderlich
cookie.sameSite; // "strict" | "lax" | "none" - SameSite-Einstellung
cookie.partitioned; // boolean - Ob das Cookie partitioniert ist (CHIPS)
cookie.maxAge; // number | undefined - Maximales Alter in Sekunden
cookie.httpOnly; // boolean - Nur über HTTP zugänglich (nicht JavaScript)

Methoden

isExpired(): boolean

Überprüft, ob das Cookie abgelaufen ist.

is-expired.ts
ts
// Abgelaufenes Cookie (Datum in der Vergangenheit)
const expiredCookie = new Bun.Cookie("name", "value", {
  expires: new Date(Date.now() - 1000),
});
console.log(expiredCookie.isExpired()); // true

// Gültiges Cookie (maxAge statt expires verwenden)
const validCookie = new Bun.Cookie("name", "value", {
  maxAge: 3600, // 1 Stunde in Sekunden
});
console.log(validCookie.isExpired()); // false

// Session-Cookie (kein Ablauf)
const sessionCookie = new Bun.Cookie("name", "value");
console.log(sessionCookie.isExpired()); // false

serialize(): string

toString(): string

Gibt eine String-Repräsentation des Cookies zurück, die für einen Set-Cookie-Header geeignet ist.

serialize-cookie.ts
ts
const cookie = new Bun.Cookie("session", "abc123", {
  domain: "example.com",
  path: "/admin",
  expires: new Date(Date.now() + 86400000),
  secure: true,
  httpOnly: true,
  sameSite: "strict",
});

console.log(cookie.serialize());
// => "session=abc123; Domain=example.com; Path=/admin; Expires=Sun, 19 Mar 2025 15:03:26 GMT; Secure; HttpOnly; SameSite=strict"
console.log(cookie.toString());
// => "session=abc123; Domain=example.com; Path=/admin; Expires=Sun, 19 Mar 2025 15:03:26 GMT; Secure; HttpOnly; SameSite=strict"

toJSON(): CookieInit

Konvertiert das Cookie in ein einfaches Objekt, das für die JSON-Serialisierung geeignet ist.

cookie-json.ts
ts
const cookie = new Bun.Cookie("session", "abc123", {
  secure: true,
  httpOnly: true,
});

const json = cookie.toJSON();
// => {
//   name: "session",
//   value: "abc123",
//   path: "/",
//   secure: true,
//   httpOnly: true,
//   sameSite: "lax",
//   partitioned: false
// }

// Funktioniert mit JSON.stringify
const jsonString = JSON.stringify(cookie);

Statische Methoden

Pars einen Cookie-String in eine Cookie-Instanz.

parse-cookie.ts
ts
const cookie = Bun.Cookie.parse("name=value; Path=/; Secure; SameSite=Lax");

console.log(cookie.name); // "name"
console.log(cookie.value); // "value"
console.log(cookie.path); // "/"
console.log(cookie.secure); // true
console.log(cookie.sameSite); // "lax"

Factory-Methode zum Erstellen eines Cookies.

cookie-from.ts
ts
const cookie = Bun.Cookie.from("session", "abc123", {
  httpOnly: true,
  secure: true,
  maxAge: 3600,
});

Typen

types.ts
ts
interface CookieInit {
  name?: string;
  value?: string;
  domain?: string;
  /** Standardmäßig '/'. Um dem Browser zu erlauben, den Pfad zu setzen, verwenden Sie einen leeren String. */
  path?: string;
  expires?: number | Date | string;
  secure?: boolean;
  /** Standardmäßig `lax`. */
  sameSite?: CookieSameSite;
  httpOnly?: boolean;
  partitioned?: boolean;
  maxAge?: number;
}

interface CookieStoreDeleteOptions {
  name: string;
  domain?: string | null;
  path?: string;
}

interface CookieStoreGetOptions {
  name?: string;
  url?: string;
}

type CookieSameSite = "strict" | "lax" | "none";

class Cookie {
  constructor(name: string, value: string, options?: CookieInit);
  constructor(cookieString: string);
  constructor(cookieObject?: CookieInit);

  readonly name: string;
  value: string;
  domain?: string;
  path: string;
  expires?: Date;
  secure: boolean;
  sameSite: CookieSameSite;
  partitioned: boolean;
  maxAge?: number;
  httpOnly: boolean;

  isExpired(): boolean;

  serialize(): string;
  toString(): string;
  toJSON(): CookieInit;

  static parse(cookieString: string): Cookie;
  static from(name: string, value: string, options?: CookieInit): Cookie;
}

class CookieMap implements Iterable<[string, string]> {
  constructor(init?: string[][] | Record<string, string> | string);

  get(name: string): string | null;

  toSetCookieHeaders(): string[];

  has(name: string): boolean;
  set(name: string, value: string, options?: CookieInit): void;
  set(options: CookieInit): void;
  delete(name: string): void;
  delete(options: CookieStoreDeleteOptions): void;
  delete(name: string, options: Omit<CookieStoreDeleteOptions, "name">): void;
  toJSON(): Record<string, string>;

  readonly size: number;

  entries(): IterableIterator<[string, string]>;
  keys(): IterableIterator<string>;
  values(): IterableIterator<string>;
  forEach(callback: (value: string, key: string, map: CookieMap) => void): void;
  [Symbol.iterator](): IterableIterator<[string, string]>;
}

Bun von www.bunjs.com.cn bearbeitet