初學者入門指南:什麼是 Hasura?為什麼開發者越來越愛用它?

Published March 18, 2025 by 徐培鈞
Web API

近年來,GraphQL 成為許多開發者的資料存取首選。

它允許前端開發者自行決定需要的欄位,並透過一個請求同時取得多個資料來源,甚至支援即時更新,這些特性都比傳統 REST API 靈活許多。

但值得注意的是:

⚠️ GraphQL 並不是一個實作好的服務或框架,它只是一種「查詢語言規範」。

真正能讓 GraphQL 運作的,是背後的 GraphQL Server —— 這是一段需要你自己實作的後端邏輯。

一般 GraphQL Server 通常會提供哪些服務?

GraphQL 本身只是「語法與查詢規範」,不包含執行機制。

真正讓它運作的是你所選用的 GraphQL Server,例如:

這些框架負責處理實際查詢邏輯、資料串接與權限控管,通常提供以下六項功能。

以下是它們的實務功能說明與常見開發挑戰:

查詢與變更的執行引擎(Query / Mutation Resolver)

功能說明:

這是 GraphQL 最核心的部分,負責處理查詢(Query)與變更(Mutation)請求。

✅ 實務流程舉例:

前端發送這樣的查詢:

query {
  user(id: "1") {
    name
    email
  }
}

後端執行的流程是:

  1. GraphQL Server 收到查詢
  2. 根據 schema 中 Query.user 的定義,呼叫對應的 Resolver
  3. Resolver 裡撰寫邏輯,例如用 ORM 取資料:
const resolvers = {
  Query: {
    user: (_, { id }, context) => db.user.findById(id)
  }
};
  1. 從資料庫撈出使用者後,回傳給前端指定的欄位(如 name、email)

⚠️ 常見挑戰:

  • 所有查詢都需手動寫 Resolver
  • 巢狀查詢會導致多次資料庫查詢(N+1 問題)
  • 分頁、排序、過濾邏輯每個都要重寫
  • 若欄位與資料庫不同步,錯誤會在執行階段才爆出來

型別定義與驗證(Schema & Type Validation)

功能說明:

你需要在 schema 中定義每個資料型別、欄位與查詢方法。這個 schema 不只是定義介面,還有以下重要功能:

  • 作為前端查詢時的補完與文件基礎
  • 執行查詢時的型別檢查與參數驗證
  • 支援工具自動生成文件與範例

✅ 實務流程舉例:

你會在 schema 中寫:

type User {
  id: ID!
  name: String!
  email: String
}

type Query {
  user(id: ID!): User
}

GraphQL Server 收到查詢後會:

  1. 驗證傳入參數 id 是非空的 ID
  2. 檢查是否有 user 這個 query
  3. 確認使用者要求的欄位 nameemail 是 User 型別定義的一部分
  4. 若全部通過,才執行 Resolver

⚠️ 常見挑戰:

  • 每新增欄位或資料表都需手動修改 schema
  • 容易與資料庫實際欄位不同步
  • Schema 複雜時可讀性與維護性大幅下降

權限控管(Authorization / Authentication)

功能說明:

GraphQL 並沒有內建權限系統,因此 Server 必須:

  • 手動注入使用者資訊(如 JWT 解碼)到 context
  • 在每個 Resolver 檢查身分與權限
  • 或是用 middleware / directive 實作通用權限檢查

✅ 實務流程舉例:

const resolvers = {
  Query: {
    me: (_, __, context) => {
      if (!context.user) throw new Error("Not authenticated");
      return context.user;
    }
  }
};

你可能也會加上一些條件限制,例如:

if (context.user.role !== 'admin') throw new Error('No permission')

⚠️ 常見挑戰:

  • 每個 Resolver 都得加上權限檢查,工作繁瑣
  • 權限規則分散各處,缺乏集中設定與檢查
  • 欄位層級或 row-level 權限難以實作,需額外邏輯分支

資料來源整合(Data Source Integration)

功能說明:

GraphQL 允許你整合多個來源(例如資料庫 + API + 快取),透過 Resolver 將資料組合成一筆回傳。

✅ 實務流程舉例:

const resolvers = {
  User: {
    posts: async (parent) => {
      return await api.get(`/posts?userId=${parent.id}`)
    }
  }
};

這段會把來自資料庫的 User,再串接 API 撈他的文章,最後組合回傳給前端。

⚠️ 常見挑戰:

  • 資料結構不一致要自行轉換格式
  • 多來源間錯誤處理與 fallback 要額外實作
  • 整合會拖慢效能,需加快取機制(如 Redis、DataLoader)
  • 若來源頻繁變動,維護成本極高

即時訂閱(GraphQL Subscription)

功能說明:
GraphQL Server 支援基於 WebSocket 的 Subscription,可讓前端訂閱資料變更,例如聊天室訊息、新通知等。

✅ 實務流程舉例:

subscription {
  newMessages(roomId: "abc") {
    id
    content
  }
}

後端會:

  1. 建立 WebSocket Server
  2. 管理訂閱者名單與 roomId 對應
  3. 當資料更新時(透過事件或 queue),推播資料到連線中用戶

⚠️ 常見挑戰:

  • 必須自己建立 WebSocket 基礎設施
  • 難以從資料庫取得「資料有異動」的事件
  • 高併發時管理連線與效能壓力極大
  • 搭配 RDB 需自行設計 Trigger + Queue 系統

自動文件產生與測試介面(Playground / GraphiQL)

功能說明:

GraphQL 的 schema 可用來產生自動文件與互動介面(例如 GraphQL Playground),讓前端能夠:

  • 快速了解所有查詢與欄位
  • 嘗試撰寫查詢、調整參數
  • 查詢時有即時補完與型別提示

✅ 實務流程舉例:

  • 當你啟用 Apollo Server,開發環境預設會打開 /graphql 頁面
  • 這個頁面會讀取 schema,生成可互動測試的 UI

⚠️ 常見挑戰:

  • schema 與實際邏輯不一致時會誤導使用者
  • 若 Resolver 沒實作,查詢會過 schema 驗證卻發生 runtime error
  • 文件註解需手動撰寫,否則內容仍然難懂

傳統 GraphQL Server vs Hasura:從實例看自動化優勢

Hasura 的價值在於,它不是簡單地「自動產生 API」,而是用最小的開發成本達到完整 GraphQL Server 的效果

以下從六個面向,透過具體範例對照,說明 Hasura 和傳統 GraphQL Server 的差異。

查詢與變更(Query / Mutation)

✅ 傳統做法:

若要查詢單一使用者資訊,你需要這樣寫 schema 與 resolver:

# schema.graphql
type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}
// resolver.js
const resolvers = {
  Query: {
    user: (_, { id }, context) => {
      return db.user.findById(id);
    }
  }
};

若要再加上條件搜尋、排序、分頁,你就得手動加參數與邏輯處理。

🚀 Hasura 做法:

你只要建立一張 users 資料表,Hasura 就會自動提供如下查詢:

query {
  users(where: { id: { _eq: 1 } }) {
    id
    name
    email
  }
}

支援:

  • 條件查詢 (where)
  • 排序 (order_by)
  • 分頁 (limit, offset)

而且完全不用寫任何 resolver。

型別定義與驗證

✅ 傳統做法:

你需要維護 GraphQL schema,並確保它與資料庫一致。若資料庫多一欄 avatar_url,你要記得更新 schema 否則會出錯。

type User {
  id: ID!
  name: String!
  avatar_url: String!
}

🚀 Hasura 做法:

Hasura 根據 PostgreSQL schema 自動生成 GraphQL 型別。

只要你在資料庫執行:

ALTER TABLE users ADD COLUMN avatar_url TEXT;

Hasura 會自動在 GraphQL API 中新增 avatar_url 欄位,型別同步、驗證自動啟用,不需重啟或重建。

權限控管

✅ 傳統做法:

你要在每個 resolver 中檢查使用者身分與資料歸屬:

if (context.user.role !== 'admin' && context.user.id !== targetUser.id) {
  throw new Error("Not authorized");
}

還要在多個 resolver 中重複撰寫這段邏輯,非常容易遺漏。

🚀 Hasura 做法:

你可以用 GUI 設定 row-level 權限。例如:

  • 角色:user
  • 資料表:users
  • 查詢條件:id = X(X 由 JWT 中的 X-Hasura-User-Id 帶入)

這樣該使用者即使試圖查詢別人的資料,Hasura 也會直接阻擋請求。

多資料來源整合

✅ 傳統做法:

如果你要查詢使用者資料 + 第三方 API 提供的社群統計資訊:

const resolvers = {
  Query: {
    userProfile: async (_, { id }) => {
      const user = await db.user.findById(id);
      const stats = await axios.get(`https://api.example.com/stats/${id}`);
      return { ...user, stats: stats.data };
    }
  }
};

你還要設計新型別 UserProfile,手動處理錯誤與資料結構。

Hasura 做法:

你可以用 Action 定義一個新的 mutation 或 query,然後串接外部 API:

# 定義一個 Action:get_user_profile
type: query
handler: https://api.example.com/user-profile
output_type: UserProfile

Hasura 會自動將這個 Action 接入 GraphQL schema,並幫你處理驗證與快取。

即時訂閱(Subscription)

✅ 傳統做法:

你需要自己建立 WebSocket server,並結合資料庫觸發通知:

pubsub.publish('NEW_MESSAGE', { message: newMessage });

然後前端再訂閱:

subscription {
  newMessage {
    id
    content
  }
}

若使用 PostgreSQL,還要額外設計 trigger + queue + listener 機制,維護成本高。

🚀 Hasura 做法:

Hasura 原生支援 GraphQL Subscription,無需額外設定。

你只需:

subscription {
  messages(where: { room_id: { _eq: "abc" } }) {
    id
    content
    sent_at
  }
}

Hasura 會自動監控資料庫變動,並透過 WebSocket 推播給前端使用者。

文件與互動查詢介面

✅ 傳統做法:

你需要手動為每個欄位加上描述,並透過 Playground 或 GraphiQL 搭配 schema 顯示自動文件。

若 schema 沒更新,文件就不正確;若 Resolver 實作與定義不符,也不會報錯。

🚀 Hasura 做法:

Hasura 內建互動式 GraphiQL 查詢介面,會根據實際資料庫欄位、資料型別、授權設定自動生成:

  • 文件說明
  • 查詢預覽
  • 範例產生器
  • 欄位補完

不需任何設定,所有人都能立刻查詢 API 能力與限制。

Hasura 開發流程實例

Hasura 最吸引人的地方之一,就是它的上手門檻極低

只要短短幾分鐘,就能擁有一套具備查詢、變更、訂閱、權限控管功能的 GraphQL API,甚至不需要寫任何一行 Resolver。

以下將帶你體驗 Hasura 的基本開發流程,從資料庫連接到第一個 API 查詢,只需要三個步驟

🔧 一分鐘快速建立 GraphQL API

Hasura 的啟用流程其實非常簡單。你只需要以下三個步驟:

第一步:準備 PostgreSQL 資料庫

Hasura 是為 PostgreSQL 設計的,因此第一步是準備一個可以連線的 PostgreSQL 資料庫。你有幾種選擇:

✅ 本地開發:

如果你在本機有安裝 PostgreSQL,可直接使用:

psql postgres://username:password@localhost:5432/mydb

✅ 雲端託管:

你也可以使用以下免費雲端方案,快速建立資料庫:

只要拿到「資料庫連線字串」,就能用來連接 Hasura。

postgres://user:password@db-url:5432/dbname

第二步:部署 Hasura 引擎

Hasura 有兩種主要部署方式:

✅ Option 1:使用 Hasura Cloud(最快上手)

  1. 前往 Hasura Cloud 官網
  2. 點選 “Get Started for Free”
  3. 註冊後建立新專案
  4. 填入剛才準備好的 PostgreSQL 資料庫連線字串

Cloud 版會自動幫你架設好 Hasura Server,並提供 Web Console(像是圖形化後台),讓你直接開始操作,不需要自己維護伺服器。

✅ Option 2:使用 Docker 在本地部署

如果你想自己控制部署,可以使用以下 docker-compose.yml

version: "3.6"
services:
  postgres:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    ports:
      - "5432:5432"

  hasura:
    image: hasura/graphql-engine
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:mysecretpassword@postgres:5432/postgres
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
      HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey

啟動:

docker-compose up -d

然後開啟 http://localhost:8080 即可看到 Hasura Console。

第三步:透過 Hasura Console 建立資料表並產生 GraphQL API

完成資料庫連線與 Hasura 部署後,開發者即可透過 Hasura Console 進行資料建模與 API 設定。

Hasura Console 是 Hasura 提供的圖形化後台管理介面,能夠讓你以低門檻的方式操作資料表、設定關聯、建立權限,甚至即時測試 GraphQL 查詢。

在這個步驟中,我們將透過 Console 建立一張簡單的 users 資料表,並實際看到 Hasura 如何立即為這張資料表自動產生對應的 GraphQL API。

建立資料表

進入 Hasura Console 後,點選上方的「Data」頁籤,並選擇「Create Table」。接著依序輸入以下資訊:

  • 表格名稱為 users
  • 加入三個欄位:
  • id:類型為 Integer,勾選為主鍵(Primary Key)
  • name:類型為 Text
  • email:類型為 Text

完成後點擊「Add Table」,Hasura 即會在 PostgreSQL 中建立該資料表,並同步產生對應的 GraphQL API。

自動產生的 GraphQL API

建立完成後,Hasura 引擎會根據你定義的資料結構,自動在 GraphQL schema 中加入以下查詢與變更能力:

  • 查詢所有使用者資料:
query
  users
    id
    name
    email
  }
}
  • 根據主鍵查詢特定使用者:
query {
  users_by_pk(id: 1) {
    id
    name
    email
  }
}
  • 新增、修改或刪除資料(Mutation):
mutation {
  insert_users(objects: [{ name: "Jane", email: "jane@example.com" }]) {
    returning {
      id
    }
  }
}
mutation {
  insert_users(objects: [{ name: "Jane", email: "jane@example.com" }]) {
    returning {
      id
    }
  }
}

所有這些操作都是動態根據資料表結構生成,無需手動撰寫任何 schema 或 Resolver。

這些 API 寫進程式碼了嗎?

需要特別注意的是,Hasura 所產生的 GraphQL API 並不會寫入任何 Git repo 或程式碼檔案中。

這些 API 是由 Hasura Server 根據資料庫當前結構,在執行期間即時生成的

你不需要維護任何後端代碼或 Resolver 檔案,也不需要重新部署即可更新 API。

只要你透過 Hasura Console 修改資料表、欄位或關聯,GraphQL API 就會自動更新,不需要額外重建 schema。

前端如何呼叫 Hasura 提供的 API?

Hasura 提供一個標準的 GraphQL API 端點,前端可以使用任何支援 GraphQL 的工具進行呼叫,例如 fetch、Axios、Apollo Client 等。

只需將查詢語法放入 HTTP POST 請求的 payload 中,即可與 Hasura 溝通。

舉例來說,前端可以使用以下方式發送查詢:

fetch("https://your-project.hasura.app/v1/graphql", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-hasura-admin-secret": "your-admin-secret"
  },
  body: JSON.stringify({
    query: `
      query {
        users {
          id
          name
          email
        }
      }
    `
  })
})
  .then(res => res.json())
  .then(data => console.log(data));

Hasura 的 API 完全遵守 GraphQL 標準,因此無論使用哪一種前端框架或 SDK,皆能輕鬆整合。

即時互動測試與查詢介面

除了 API 本體外,Hasura Console 還內建 GraphiQL 查詢工具,讓你能夠直接在瀏覽器中撰寫查詢、補完欄位、預覽結構與回傳格式。

這對於前端開發者而言極為方便,可快速驗證查詢格式並複製語法貼入程式碼中使用,完全不需要等後端提供 Swagger 文件或手動寫 API 文件。

總結來說,Hasura 提供的開發體驗是前所未有的簡潔與高效。

你只需透過 Console 建立資料表,Hasura 即可根據該表的結構自動產生功能完整的 GraphQL API。

這些 API 並不需要寫入任何後端代碼或部署腳本,而是以動態生成的方式即時提供,且可直接由前端透過標準 GraphQL 請求格式進行呼叫。

這也意味著,你可以把更多心力集中在資料設計與前端開發上,而不用花費大量時間在建立與維護後端樣板程式碼上。

結語:為什麼 Hasura 是現代開發的未來?

Hasura 並不只是另一個後端工具,更不僅僅是一個 GraphQL Server。

它代表的是一種全新的開發思維轉變

從傳統的「自己手寫 Resolver、維護 Schema、手動控管權限」的高成本開發流程,邁向一個自動化、資料驅動、可即時擴展的開發時代

在過去,開發一個穩定的後端 API 系統往往需要投入大量資源:

資料表設計要和 schema 同步、每個欄位都得寫 resolver、權限檢查可能散落在十幾個地方,修改一次需求往往意味著多處同步更新與測試。

這不只是耗時耗力,也讓開發團隊很難聚焦在真正的產品價值上。

Hasura 的出現,正是為了解決這些重工與不必要的心智負擔。

它將資料表視為第一公民,從中自動產生符合標準的 GraphQL API,內建型別驗證、欄位控制、即時訂閱與事件觸發機制。

讓你不需要寫後端邏輯,就能完成過去可能要三個工程師一週才能交付的 API 原型。

如果你正面臨以下情境,那麼 Hasura 值得你深入了解:

  • 你想轉換到 GraphQL,但被 Resolver 邏輯卡住:
    Hasura 幫你省去 90% 的手寫 Resolver,直接從資料庫產生查詢、變更、訂閱功能,且支援複雜條件、分頁、排序、關聯查詢,讓你可以專注在資料設計與前端開發。
  • 你需要快速打造可用的 API:
    不論是 hackathon、MVP、內部工具,Hasura 都能在幾分鐘內讓你擁有完整 API 能力,還能視覺化操作資料與權限設定。開發流程大幅簡化,維護成本大幅下降。
  • 你覺得權限設計麻煩又容易出錯:
    Hasura 的角色與條件式權限設計器,讓你只需要思考「誰可以看到哪些資料」,其餘由系統自動處理。比起傳統自己在程式碼中寫邏輯,Hasura 提供的設計方式更安全、更容易審查與維護。

更重要的是:Hasura 並不排斥擴充,它只是讓你先把 80% 標準工作自動化

你仍然可以:

  • 用 Action 將特定查詢/Mutation 交給自建 API 處理
  • 用 Remote Schema 整合現有 GraphQL 或 REST API
  • 用 Event Trigger 串接外部 webhook、函式服務或佇列系統

這代表你永遠不會被 Hasura 綁住,它只是把那些你不想再重複造輪子的事情做好,讓你能將開發力真正投入在差異化的業務邏輯與產品設計上。

現代開發的重點,不是「你能做多少」,而是「你能省下多少」

Hasura 的價值不在於炫技,而是在於它讓你做得更少,但得到更多。

  • ✅ 少寫程式碼,卻多了 API 能力
  • ✅ 少部署系統,卻多了資料即時推播
  • ✅ 少花時間解 bug,卻多了自動型別與驗證
  • ✅ 少花心思處理權限,卻多了安全與一致性

如果你正在尋找一種能夠兼顧開發效率、維護便利性與擴充彈性的 API 解法,那麼 Hasura 絕對值得一試。

這不只是一個開發工具,而是一種更聰明、更高效、更現代的 API 架構思維。