iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0

前言

在實作後端專案的過程中,常會碰到的問題就是不知道資料庫該部屬到哪裡好,大部分都只需要付費,不然就是免費一點時間後還是需要付費,於是 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 (核心資料庫)             │
└─────────────────────────────────────┘

資料庫建立

建立 supabase 專案

image
image
密碼記得保存下來放到環境變數 DB_PASSWORD

建立 Table

到 SQL Editor 建立我們要的 user table
image
image

-- 啟用 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 就可以看到有成功新增了
image
或是也能到 database 去看
image

環境變數

到 Connect 拿需要的環境變數
image
image

DB_HOST 填入 host
DB_PORT 填入 port
DB_NAME 填入 database
DB_USER 填入 user

測試連線

  1. 確認服務器運行
npm run dev
  1. Postman 測試
POST http://localhost:3000/api/v1/auth/register
Content-Type: application/json

{
  "email": "test@example.com",
  "password": "Test123456",
  "name": "測試用戶"
}

這邊會出現無法寄出驗證信的錯誤,後面再處理,只要 supabase 有出現資料就可以了
image


上一篇
Day24 - 信箱驗證
下一篇
Day26 - possgreSQL(1)
系列文
欸欸!! 這是我的學習筆記26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言