在實作後端專案的過程中,常會碰到的問題就是不知道資料庫該部屬到哪裡好,大部分都只需要付費,不然就是免費一點時間後還是需要付費,於是 supabase 就成了很棒的選擇。
Supabase 是一個開源的 Postgres 開發平台,提供構建產品所需的所有後端功能。
簡單來說:
「Supabase = 資料庫 + 身份驗證 + API + 檔案儲存 + 即時功能 + Edge Functions + AI 工具 = 完整的後端即服務(BaaS)」
Supabase 是開源版的 Firebase,但用的是 PostgreSQL,而且功能更強大
Supabase 不是 Firebase 的 1:1 對應,使用的技術選擇完全不同,一切都是開源的,並且盡可能使用和支援現有工具而不是從頭開發。
┌─────────────────────────────────────┐
│ Supabase Platform │
├─────────────────────────────────────┤
│ Dashboard (管理介面) │
├─────────────────────────────────────┤
│ PostgREST (自動生成 REST API) │
├─────────────────────────────────────┤
│ GoTrue (身份驗證) │
├─────────────────────────────────────┤
│ Realtime (即時訂閱) │
├─────────────────────────────────────┤
│ Storage (檔案儲存) │
├─────────────────────────────────────┤
│ Edge Functions (Serverless) │
├─────────────────────────────────────┤
│ PostgreSQL (核心資料庫) │
└─────────────────────────────────────┘
密碼記得保存下來放到環境變數 DB_PASSWORD
到 SQL Editor 建立我們要的 user table
-- 啟用 UUID 支持
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 基本 ENUM 類型
CREATE TYPE "UserRole" AS ENUM ('user', 'admin');
CREATE TYPE "Gender" AS ENUM ('male', 'female', 'other');
-- 完整版 users 表
CREATE TABLE "users" (
"userId" uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
"email" character varying(100) UNIQUE NOT NULL,
"password" character varying(60) NULL,
"name" character varying(50) NOT NULL,
"role" "UserRole" NOT NULL DEFAULT 'user',
"avatar" character varying(255),
-- 郵箱驗證
"verificationToken" character varying(50),
"verificationTokenExpires" timestamp without time zone,
"isEmailVerified" boolean NOT NULL DEFAULT false,
-- 密碼重置
"passwordResetToken" character varying(50),
"passwordResetExpires" timestamp without time zone,
-- 速率限制相關
"lastVerificationAttempt" timestamp without time zone,
"lastPasswordResetAttempt" timestamp without time zone,
-- OAuth
"oauthProviders" jsonb NOT NULL DEFAULT '[]'::jsonb,
-- 時間戳記
"createdAt" timestamp without time zone NOT NULL DEFAULT now(),
"updatedAt" timestamp without time zone NOT NULL DEFAULT now()
);
-- 基本索引
CREATE INDEX "IDX_users_email" ON "users" ("email");
CREATE INDEX "IDX_users_role" ON "users" ("role");
-- 更新時間戳觸發器
CREATE OR REPLACE FUNCTION "fn_updateUpdatedAt"()
RETURNS TRIGGER AS $$
BEGIN
NEW."updatedAt" = NOW();
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER "TRG_users_updated"
BEFORE UPDATE ON "users"
FOR EACH ROW EXECUTE FUNCTION "fn_updateUpdatedAt"();
到 Table Editor 就可以看到有成功新增了
或是也能到 database 去看
到 Connect 拿需要的環境變數
DB_HOST
填入 host
DB_PORT
填入 port
DB_NAME
填入 database
DB_USER
填入 user
npm run dev
POST http://localhost:3000/api/v1/auth/register
Content-Type: application/json
{
"email": "test@example.com",
"password": "Test123456",
"name": "測試用戶"
}
這邊會出現無法寄出驗證信的錯誤,後面再處理,只要 supabase 有出現資料就可以了