<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>2026/10 on BenzHub</title><link>https://benzhub.github.io/archives/2026/10/</link><description>Recent content in 2026/10 on BenzHub</description><generator>Hugo</generator><language>zh-TW</language><lastBuildDate>Thu, 15 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://benzhub.github.io/archives/2026/10/index.xml" rel="self" type="application/rss+xml"/><item><title>Supabase Storage：Image Transformations、Resumable 與 S3 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/026-storage-transformations-s3/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/026-storage-transformations-s3/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們把 &lt;strong&gt;Storage&lt;/strong&gt; 的「安全」守住了；這一篇要處理「效能與規模」。你會學到用 &lt;strong&gt;Image Transformations&lt;/strong&gt; 在 &lt;code&gt;getPublicUrl&lt;/code&gt;／&lt;code&gt;createSignedUrl&lt;/code&gt; 帶 &lt;code&gt;transform&lt;/code&gt; 即時產縮圖、搭 &lt;strong&gt;CDN&lt;/strong&gt; 快取省頻寬；用 &lt;strong&gt;Resumable Uploads&lt;/strong&gt;（&lt;strong&gt;TUS&lt;/strong&gt; 協定）穩穩上傳 6MB 以上的大檔；再用 &lt;strong&gt;S3&lt;/strong&gt; 相容 API 讓 AWS SDK、&lt;code&gt;rclone&lt;/code&gt;、&lt;code&gt;s3cmd&lt;/code&gt; 這些既有工具直接操作 &lt;strong&gt;Supabase Storage&lt;/strong&gt;。一次講清「三種上傳／取用方式」各自的定位，Storage 段就此收尾。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase Storage 權限與存取控制：用 RLS 守好每個檔案 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/025-storage-access-control/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/025-storage-access-control/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇你學會了建 &lt;strong&gt;bucket&lt;/strong&gt;、上傳與取用檔案，但存取控制還很粗：public 全公開、private 靠簽名連結。這一篇要把你在 009–011 篇熟透的 &lt;strong&gt;RLS&lt;/strong&gt; 下沉到 &lt;strong&gt;Storage&lt;/strong&gt;——原來 &lt;strong&gt;Supabase Storage&lt;/strong&gt; 的權限就是 Postgres RLS，政策全寫在 &lt;strong&gt;&lt;code&gt;storage.objects&lt;/code&gt;&lt;/strong&gt; 資料表上，依 &lt;strong&gt;&lt;code&gt;bucket_id&lt;/code&gt;&lt;/strong&gt; 與路徑第一層資料夾授權。我們會實作「每人只能存取自己資料夾」「公開讀、私密寫」等常見模式，並釐清 &lt;strong&gt;public bucket&lt;/strong&gt; 與 &lt;strong&gt;signed URL&lt;/strong&gt; 各自的角色。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase Storage 物件儲存入門：上傳、取用檔案 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/024-storage-intro/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/024-storage-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;登入的故事講完了，這一篇換上全新主題：&lt;strong&gt;檔案&lt;/strong&gt;。&lt;strong&gt;Supabase Storage&lt;/strong&gt; 是 Supabase 內建的**物件儲存（Object Storage）**服務——圖片、影片、PDF 這類「不適合塞進資料表」的檔案，都交給它保管。本篇帶你從零建立 &lt;strong&gt;bucket&lt;/strong&gt;、用 &lt;code&gt;upload&lt;/code&gt; 上傳、用 &lt;code&gt;getPublicUrl&lt;/code&gt; 與 &lt;code&gt;createSignedUrl&lt;/code&gt; 取用、用 &lt;code&gt;list&lt;/code&gt;／&lt;code&gt;remove&lt;/code&gt; 管理，並學會 &lt;code&gt;user_id/檔名&lt;/code&gt; 的路徑慣例與大小、&lt;strong&gt;MIME&lt;/strong&gt; 限制。這是 &lt;strong&gt;Storage&lt;/strong&gt; 段的第一篇。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase MFA 與 SSR：多因子驗證與伺服器端渲染 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/023-auth-mfa-ssr/</link><pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/023-auth-mfa-ssr/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前面幾篇我們把「怎麼進門」講完了——&lt;strong&gt;email 密碼&lt;/strong&gt;、&lt;strong&gt;OAuth&lt;/strong&gt;、&lt;strong&gt;Magic Link 與 OTP&lt;/strong&gt;，全都通往同一組 session。這一篇談「進門之後怎麼守得更穩」：先幫登入加上&lt;strong&gt;第二道防線&lt;/strong&gt;，也就是 &lt;strong&gt;MFA（多因子驗證）／TOTP&lt;/strong&gt;，用 &lt;code&gt;enroll&lt;/code&gt;／&lt;code&gt;challenge&lt;/code&gt;／&lt;code&gt;verify&lt;/code&gt; 三步把 session 從 &lt;strong&gt;AAL1&lt;/strong&gt; 升級成 &lt;strong&gt;AAL2&lt;/strong&gt;，再用 &lt;strong&gt;RLS&lt;/strong&gt; 依 &lt;code&gt;aal&lt;/code&gt; 限制高敏感操作；接著處理 &lt;strong&gt;SSR&lt;/strong&gt;——用 &lt;code&gt;@supabase/ssr&lt;/code&gt; 以 &lt;strong&gt;cookie&lt;/strong&gt; 保管 session，靠 &lt;strong&gt;middleware&lt;/strong&gt; 在每個請求刷新 token，伺服器端一律用 &lt;code&gt;getUser()&lt;/code&gt; 而非 &lt;code&gt;getSession()&lt;/code&gt; 做授權。這是整個 Auth 段的收尾。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase Magic Link 與 OTP：無密碼登入實作 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/022-auth-magiclink-otp/</link><pubDate>Sun, 11 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/022-auth-magiclink-otp/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前兩篇我們讓使用者用 &lt;strong&gt;email&lt;/strong&gt; 加密碼、或用 &lt;strong&gt;Google／GitHub&lt;/strong&gt; 社群帳號登入。這一篇走向另一個極端——&lt;strong&gt;完全不要密碼&lt;/strong&gt;：使用者只留一個 email，我們寄一條神奇連結（&lt;strong&gt;Magic Link&lt;/strong&gt;）或一組 &lt;strong&gt;6 碼 OTP&lt;/strong&gt;，點一下或輸入六位數就登入。核心是一支 &lt;code&gt;signInWithOtp&lt;/code&gt;，寄連結還是寄驗證碼只差在 email 樣板用 &lt;code&gt;{{ .ConfirmationURL }}&lt;/code&gt; 還是 &lt;code&gt;{{ .Token }}&lt;/code&gt;；驗證碼那條再用 &lt;code&gt;verifyOtp&lt;/code&gt; 收尾。我們也會講 &lt;code&gt;shouldCreateUser&lt;/code&gt;、簡訊 OTP、以及限流與過期這些實務細節。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase OAuth 社群登入：Google／GitHub 一鍵登入實作 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/021-auth-oauth/</link><pubDate>Sat, 10 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/021-auth-oauth/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《Email/Password 驗證》我們讓使用者用 email 加密碼登入。這一篇換一種對使用者更省事的進門方式：&lt;strong&gt;OAuth 社群登入&lt;/strong&gt;——按一顆「用 &lt;strong&gt;Google&lt;/strong&gt; 登入」或「用 &lt;strong&gt;GitHub&lt;/strong&gt; 登入」的按鈕就完成。我們會走完整條路：在 Dashboard 設定 &lt;strong&gt;provider&lt;/strong&gt; 的 client id/secret 與 callback URL、前端呼叫 &lt;code&gt;signInWithOAuth&lt;/code&gt; 觸發跳轉、理解 &lt;strong&gt;PKCE&lt;/strong&gt; 流程如何防截取、在 callback route 用 &lt;code&gt;exchangeCodeForSession&lt;/code&gt; 換回 &lt;strong&gt;session&lt;/strong&gt;，最後讀取 provider 帶回的個人資料。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase Email/Password 驗證：註冊、確認信與密碼重設 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/020-auth-email-password/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/020-auth-email-password/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《Auth 入門》我們把 &lt;strong&gt;session&lt;/strong&gt;、&lt;strong&gt;JWT&lt;/strong&gt; 與 &lt;strong&gt;RLS&lt;/strong&gt; 的整合地基打好了。這一篇要把它落地：實作最經典、幾乎每個應用都會用到的 &lt;strong&gt;Email / Password&lt;/strong&gt; 驗證。我們會走完整條路——&lt;code&gt;signUp&lt;/code&gt; 註冊、&lt;strong&gt;Email 確認信&lt;/strong&gt;流程、&lt;code&gt;signInWithPassword&lt;/code&gt; 登入、&lt;code&gt;signOut&lt;/code&gt; 登出，一直到 &lt;code&gt;resetPasswordForEmail&lt;/code&gt; + &lt;code&gt;updateUser&lt;/code&gt; 的&lt;strong&gt;密碼重設&lt;/strong&gt;，並用 &lt;code&gt;onAuthStateChange&lt;/code&gt; 即時監聽狀態變化。你會得到一套真的能跑的驗證系統。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase Auth 入門：使用者、Session 與 JWT | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/019-auth-intro/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/019-auth-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Supabase Auth&lt;/strong&gt; 建立在 &lt;strong&gt;GoTrue&lt;/strong&gt; 這套開源驗證伺服器之上，負責「你是誰」這件事——使用者的註冊、登入、以及登入狀態（&lt;strong&gt;session&lt;/strong&gt;）的管理。這一篇是核心服務的起點：我們會講清楚 &lt;strong&gt;access token&lt;/strong&gt;（&lt;strong&gt;JWT&lt;/strong&gt;）與 &lt;strong&gt;refresh token&lt;/strong&gt; 怎麼搭配、&lt;code&gt;auth.users&lt;/code&gt; 系統表與你自建的 &lt;code&gt;public.profiles&lt;/code&gt; 如何關聯，以及最關鍵的一環——&lt;strong&gt;JWT&lt;/strong&gt; 裡的 &lt;code&gt;sub&lt;/code&gt; 為什麼等於 &lt;code&gt;auth.uid()&lt;/code&gt;，讓 &lt;strong&gt;Auth&lt;/strong&gt; 與前面學過的 &lt;strong&gt;RLS&lt;/strong&gt; 無縫接上。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Supabase 型別生成與進階用法 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/018-typescript-types/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/018-typescript-types/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們把 &lt;strong&gt;supabase-js&lt;/strong&gt; 的 &lt;strong&gt;CRUD&lt;/strong&gt; 讀寫玩熟了，但那些查詢的 &lt;code&gt;data&lt;/code&gt; 型別其實還很鬆散。這一篇要補上最後一塊拼圖——&lt;strong&gt;型別安全&lt;/strong&gt;：用 &lt;strong&gt;Supabase CLI&lt;/strong&gt; 的 &lt;code&gt;supabase gen types typescript&lt;/code&gt; 從資料庫 schema 生成 &lt;code&gt;Database&lt;/code&gt; 型別，搭配 &lt;code&gt;createClient&amp;lt;Database&amp;gt;&lt;/code&gt; 注入 client，讓每一次 &lt;code&gt;select&lt;/code&gt;、&lt;code&gt;insert&lt;/code&gt;、&lt;code&gt;update&lt;/code&gt; 都有完整的 &lt;strong&gt;TypeScript&lt;/strong&gt; 推導與 &lt;strong&gt;IntelliSense&lt;/strong&gt;。你還會學到 &lt;code&gt;Tables&lt;/code&gt; / &lt;code&gt;TablesInsert&lt;/code&gt; 等 helper、用 &lt;code&gt;QueryData&lt;/code&gt; 推導複雜關聯查詢、&lt;code&gt;overrideTypes&lt;/code&gt; 覆寫，以及 &lt;code&gt;abortSignal&lt;/code&gt;、&lt;code&gt;csv&lt;/code&gt;、&lt;code&gt;explain&lt;/code&gt; 等進階選項與 &lt;strong&gt;service_role&lt;/strong&gt; 客戶端。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>supabase-js CRUD 查詢與寫入 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/017-crud-operations/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/017-crud-operations/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們認識了 &lt;strong&gt;supabase-js&lt;/strong&gt; 這個統一 &lt;strong&gt;client&lt;/strong&gt;，也知道 &lt;code&gt;supabase.from()&lt;/code&gt; 是資料庫子模組的入口。這一篇就把最常用的一塊——&lt;strong&gt;CRUD&lt;/strong&gt;（Create、Read、Update、Delete）——徹底玩熟。你會學到用 &lt;code&gt;insert&lt;/code&gt; 新增（單筆與多筆批次）、&lt;code&gt;select&lt;/code&gt; 查詢、&lt;code&gt;update&lt;/code&gt; 搭配 &lt;strong&gt;filter&lt;/strong&gt; 修改、&lt;code&gt;upsert&lt;/code&gt; 靠 &lt;code&gt;onConflict&lt;/code&gt; 做「有就更新、沒有就新增」、&lt;code&gt;delete&lt;/code&gt; 刪除，並且看懂貫穿全部操作的 &lt;code&gt;{ data, error }&lt;/code&gt; 錯誤處理模式、為什麼 &lt;strong&gt;v2&lt;/strong&gt; 寫入預設不回傳資料、以及 &lt;code&gt;.single()&lt;/code&gt; 與 &lt;code&gt;.maybeSingle()&lt;/code&gt; 的差別。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>supabase-js 客戶端入門 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/016-client-sdk-intro/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/016-client-sdk-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前面十五篇，我們一路用 &lt;strong&gt;SQL&lt;/strong&gt;、&lt;code&gt;curl&lt;/code&gt; 與裸的 &lt;code&gt;.from()&lt;/code&gt;／&lt;code&gt;.rpc()&lt;/code&gt; 認識了 &lt;strong&gt;Supabase&lt;/strong&gt; 的資料庫與 &lt;strong&gt;REST API&lt;/strong&gt;。但真正在寫應用時，你不會手刻 &lt;strong&gt;HTTP&lt;/strong&gt; 請求——你會用官方的 &lt;strong&gt;supabase-js&lt;/strong&gt; 客戶端。這一篇帶你正式認識這個 &lt;strong&gt;SDK&lt;/strong&gt;：怎麼 &lt;code&gt;npm install @supabase/supabase-js&lt;/code&gt;、怎麼用 &lt;code&gt;createClient(url, anonKey)&lt;/code&gt; 建立一個 &lt;strong&gt;client&lt;/strong&gt;、這個 client 底下 &lt;code&gt;from&lt;/code&gt;／&lt;code&gt;auth&lt;/code&gt;／&lt;code&gt;storage&lt;/code&gt;／&lt;code&gt;realtime&lt;/code&gt;／&lt;code&gt;functions&lt;/code&gt; 五大子模組各管什麼，以及最關鍵的兩個實務問題——&lt;strong&gt;瀏覽器該用哪把金鑰、伺服器該用哪把&lt;/strong&gt;，還有為什麼整個 App 只該建立&lt;strong&gt;一個&lt;/strong&gt; client（單例模式）。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>RPC 呼叫資料庫函式 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/015-rpc-functions/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/015-rpc-functions/</guid><description>&lt;blockquote&gt;
&lt;p&gt;學會了《Embedded Resources 關聯查詢》之後，你已經能用一支 &lt;strong&gt;API&lt;/strong&gt; 把整棵關聯資料樹撈回來。但有些需求，光靠自動 &lt;strong&gt;API&lt;/strong&gt; 的宣告式查詢還是不夠——&lt;strong&gt;多步驟交易&lt;/strong&gt;（如轉帳要嘛全成功、要嘛全失敗）、跨多表的&lt;strong&gt;複雜聚合&lt;/strong&gt;、需要&lt;strong&gt;繞過或精細控制權限&lt;/strong&gt;的管理操作。這些更適合封裝進 &lt;strong&gt;PostgreSQL&lt;/strong&gt; 的&lt;strong&gt;資料庫函式&lt;/strong&gt;，再用 &lt;strong&gt;Supabase&lt;/strong&gt; 的 &lt;strong&gt;RPC&lt;/strong&gt;（&lt;code&gt;supabase.rpc('fn', { args })&lt;/code&gt;）一支呼叫觸發。這一篇帶你把 &lt;strong&gt;RPC&lt;/strong&gt; 用到位：對應 &lt;strong&gt;Postgres function&lt;/strong&gt;、依名稱傳參數、回傳 scalar／setof／table、對 &lt;strong&gt;SETOF&lt;/strong&gt; 結果串接 &lt;strong&gt;PostgREST&lt;/strong&gt; 篩選、&lt;code&gt;security definer&lt;/code&gt; 搭配 &lt;code&gt;search_path&lt;/code&gt;，並看懂「&lt;strong&gt;RPC&lt;/strong&gt; 其實也走 &lt;strong&gt;REST&lt;/strong&gt;」（&lt;code&gt;/rest/v1/rpc/fn&lt;/code&gt;）的原理，以及 &lt;strong&gt;pg_graphql&lt;/strong&gt; 概觀。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Embedded Resources 關聯查詢 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/014-embedded-resources/</link><pubDate>Sat, 03 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/014-embedded-resources/</guid><description>&lt;blockquote&gt;
&lt;p&gt;學會了《查詢、篩選與分頁》之後，你已經能對&lt;strong&gt;單一資料表&lt;/strong&gt;查得又準又快。但真實世界的資料很少是孤立的——文章有&lt;strong&gt;作者&lt;/strong&gt;、訂單有&lt;strong&gt;客戶&lt;/strong&gt;、商品有&lt;strong&gt;分類&lt;/strong&gt;、演員演過很多&lt;strong&gt;電影&lt;/strong&gt;。這些&lt;strong&gt;關聯&lt;/strong&gt;該怎麼在一次查詢裡一起撈出來，而不用發好幾支 API、再自己在前端拼？這一篇帶你把 &lt;strong&gt;Supabase&lt;/strong&gt;（&lt;strong&gt;PostgREST&lt;/strong&gt;）的 &lt;strong&gt;Embedded Resources 關聯查詢&lt;/strong&gt;用到位：靠&lt;strong&gt;外鍵（Foreign Key）&lt;strong&gt;自動偵測表間關係，用 &lt;code&gt;select('*, author(*)')&lt;/code&gt; 這種寫法一次把關聯 &lt;strong&gt;join&lt;/strong&gt; 成巢狀 JSON，並學會 &lt;code&gt;!inner&lt;/code&gt; 內連接、巢狀篩選、多對多、以及多個外鍵指向同表時的&lt;/strong&gt;關聯消歧義&lt;/strong&gt;，徹底告別 &lt;strong&gt;N+1&lt;/strong&gt; 查詢。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>查詢、篩選與分頁 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/013-query-filter-pagination/</link><pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/013-query-filter-pagination/</guid><description>&lt;blockquote&gt;
&lt;p&gt;學會了 &lt;strong&gt;PostgREST&lt;/strong&gt; 自動 API 之後，真正的日常查詢幾乎不會是「把整張表撈出來」——你需要精準地&lt;strong&gt;篩選&lt;/strong&gt;、&lt;strong&gt;排序&lt;/strong&gt;，並在大量資料裡&lt;strong&gt;分頁&lt;/strong&gt;。這一篇會帶你把 &lt;strong&gt;Supabase&lt;/strong&gt; 的讀取查詢用到位：用 &lt;code&gt;select&lt;/code&gt; 只取需要的欄位、用 &lt;code&gt;eq&lt;/code&gt;／&lt;code&gt;gt&lt;/code&gt;／&lt;code&gt;ilike&lt;/code&gt;／&lt;code&gt;in&lt;/code&gt;／&lt;code&gt;is&lt;/code&gt;／&lt;code&gt;contains&lt;/code&gt; 等&lt;strong&gt;篩選運算子&lt;/strong&gt;組出精準條件、用 &lt;code&gt;or&lt;/code&gt; 串邏輯、用 &lt;code&gt;order&lt;/code&gt; 排序、用 &lt;code&gt;range&lt;/code&gt; 與 &lt;code&gt;limit&lt;/code&gt; 分頁、用 &lt;code&gt;count&lt;/code&gt; 拿總筆數，最後用 &lt;code&gt;single&lt;/code&gt;／&lt;code&gt;maybeSingle&lt;/code&gt; 優雅地取單筆。全程以 &lt;strong&gt;supabase-js&lt;/strong&gt; 為主、附上 &lt;strong&gt;REST&lt;/strong&gt; 對照，讓你一眼看穿 SDK 底層發了什麼。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>PostgREST 自動 API 入門 | Supabase 完整教學</title><link>https://benzhub.github.io/post/supabase/012-postgrest-intro/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/supabase/012-postgrest-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PostgREST&lt;/strong&gt; 是 Supabase 自動 API 的心臟——你在資料庫裡建好一張 table，它就自動幫你生出一整套 &lt;strong&gt;REST API&lt;/strong&gt;，端點長得像 &lt;code&gt;/rest/v1/products&lt;/code&gt;，支援讀寫、篩選、排序、分頁，完全不用手寫後端。這一篇會帶你認識這套「建表即有 API」的魔法：endpoint 怎麼組成、&lt;code&gt;apikey&lt;/code&gt; 與 &lt;code&gt;Authorization: Bearer&lt;/code&gt; 兩個 header 各自負責什麼、為什麼 &lt;strong&gt;REST 一樣受 RLS 保護&lt;/strong&gt;，並對照 &lt;code&gt;curl&lt;/code&gt; 直呼與 &lt;code&gt;supabase-js&lt;/code&gt; 兩種寫法，最後解決「新建的表 API 卻看不到」的 &lt;strong&gt;schema cache&lt;/strong&gt; 問題。&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>