ANLEITUNG

Deine erste App mit Next.js

Eine To-do-Liste, bei der sich Leute mit ihrer E-Mail registrieren und nur ihre eigenen To-dos sehen. Du nutzt das Dashboard für die Datenbank und @espobase/client in der App.

← Alle Anleitungen

1. Projekt und Tabelle anlegen

Leg im Dashboard ein Projekt an. Öffne den SQL-Editor und führe aus:

create table todos (
  id bigint generated by default as identity primary key,
  owner_id uuid not null default espobase.user_id(),
  title text not null,
  done boolean not null default false,
  created_at timestamptz not null default now()
);

-- Row level security is already on. This rule lets each signed-in user see and change only their own todos:
create policy "Users manage their own todos" on todos
  for all
  using (owner_id = espobase.user_id())
  with check (owner_id = espobase.user_id());

Lieber klicken? Leg die Tabelle im Tabelleneditor an und füge dann unter Datenbank › Richtlinien die Vorlage „Nutzer besitzt Zeile“ mit owner_id als Besitzerspalte hinzu.

2. Einstellungen und Schlüssel

  • Authentifizierung › Einstellungen: Setz die Site-URL auf die Adresse, unter der deine App läuft (z. B. http://localhost:3000 während der Entwicklung). Bestätigungs- und Passwort-Zurücksetzungs-E-Mails verlinken dorthin.
  • API: Erstelle einen öffentlichen Schlüssel. Kopiere ihn jetzt; Schlüssel werden nur beim Erstellen angezeigt.

Installiere in deiner Next.js-App den Client und füge die Einstellungen zu .env.local hinzu:

npm install @espobase/client
NEXT_PUBLIC_ESPOBASE_URL=https://api.espobase.com/project/<your project ref>
NEXT_PUBLIC_ESPOBASE_KEY=eb_pk_…   # the PUBLISHABLE key: safe in the browser

Leg nie einen geheimen Schlüssel (eb_sk_…) in eine NEXT_PUBLIC_-Variable: Diese werden an den Browser ausgeliefert. Mit der CLI gibt npx espobase init die URL aus und schreibt die TypeScript-Typen für dich.

3. Der Client

// lib/espobase.ts
import { createClient } from "@espobase/client";

export const espobase = createClient(
  process.env.NEXT_PUBLIC_ESPOBASE_URL!,
  process.env.NEXT_PUBLIC_ESPOBASE_KEY!,
);

4. Registrierung und Anmeldung

"use client";
import { espobase } from "@/lib/espobase";

// Sign up: Espobase emails a confirmation link to your Site URL.
await espobase.auth.signUp({ email, password });

// Sign in (after confirming): the session is kept and refreshed for you.
await espobase.auth.signInWithPassword({ email, password });

// React to sign-in and sign-out anywhere in your app.
espobase.auth.onAuthStateChange((_event, session) => setSession(session));

Der Bestätigungslink öffnet deine Site-URL mit dem Token nach einem #. Bestätige es mit espobase.auth.verifyEmail({ token }): Siehe Anmeldung und Sicherheitsregeln für die wenigen Zeilen, die das erledigen, und für die Passwort-Zurücksetzung.

5. Daten lesen und schreiben

// Only the signed-in user's todos come back: the security rule filters them.
const { data: todos, error } = await espobase.from("todos").select("*").order("created_at");

// owner_id fills itself in (its default is espobase.user_id()).
await espobase.from("todos").insert({ title: "Buy milk" });

await espobase.from("todos").update({ done: true }).eq("id", todo.id);
await espobase.from("todos").delete().eq("id", todo.id);

Jede Anfrage trägt den angemeldeten Nutzer mit, und die Datenbank wendet deine Regel an. Ein nicht angemeldeter Nutzer bekommt eine leere Liste, und niemand kann die To-dos anderer lesen oder ändern, auch nicht durch direkte Aufrufe der API.