橙宝书
外部数据库

Workers 连接 Supabase:supabase-js 或 Hyperdrive

用 @supabase/supabase-js 走 PostgREST,或用 Hyperdrive 池化直连 Postgres,按查询频率与冷启动要求二选一。

编辑与核验:橙宝书编辑团队 ·

INTEGRATIONS进阶30 分钟最后核验:2026-08-27

先给结论

用 Supabase 的表 API、Auth、Storage 时选 @supabase/supabase-js(HTTP/PostgREST,天然适合 Workers);需要原生 SQL、连接池和更低延迟时用 Hyperdrive + postgres.js 直连 Postgres。

两条路径怎么选

路径适合关键限制
@supabase/supabase-js表查询、行级安全(RLS)、Auth、Storage 全套 Supabase 功能走 PostgREST,表达能力受 API 限制;无连接池收益
Hyperdrive + postgres.js原生 SQL、复杂事务、高频短查询需要 Hyperdrive 配置;不支持 LISTEN/NOTIFY 与 advisory locks

Supabase 免费计划的项目约 7 天无活动会自动暂停(可恢复)。暂停期间两条路径都会失败,排障时先在 Supabase Dashboard 确认项目状态。

路径一:supabase-js

npm i @supabase/supabase-js
npx wrangler secret put SUPABASE_URL
npx wrangler secret put SUPABASE_SERVICE_ROLE_KEY

SUPABASE_URL 形如 https://<project-ref>.supabase.co,service role key 在 Supabase Dashboard 的 API 设置里。service key 能绕过 RLS,只能存在服务端 Secret 里,绝不能进前端包。

src/index.ts
import { createClient } from '@supabase/supabase-js';

interface Env {
  SUPABASE_URL: string;
  SUPABASE_SERVICE_ROLE_KEY: string;
}

export default {
  async fetch(request, env: Env): Promise<Response> {
    const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_SERVICE_ROLE_KEY);
    const { data, error } = await supabase.from('notes').select('id,title').limit(10);
    if (error) {
      return Response.json({ error: error.message }, { status: 502 });
    }
    return Response.json({ notes: data });
  },
};

该路径不需要任何 wrangler 绑定,Secret 之外没有额外配置。

路径二:Hyperdrive 直连 Postgres

先在 Supabase Dashboard 的连接信息里拿到直连串,形如 postgres://USER:PASSWORD@HOST:PORT/postgres,然后创建 Hyperdrive 配置:

npx wrangler hyperdrive create supabase-pg --connection-string="postgres://USER:PASSWORD@HOST:PORT/postgres"
wrangler.jsonc
{
  "name": "notes-api",
  "compatibility_date": "2026-08-25",
  "compatibility_flags": ["nodejs_compat"],
  "hyperdrive": [
    { "binding": "HYPERDRIVE", "id": "<创建命令返回的 id>" }
  ]
}
src/index.ts
import { Client } from 'pg';

interface Env {
  HYPERDRIVE: Hyperdrive;
}

export default {
  async fetch(request, env: Env): Promise<Response> {
    const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
    try {
      await client.connect();
      const result = await client.query('SELECT id, title FROM notes LIMIT 10');
      return Response.json({ notes: result.rows });
    } catch (error) {
      return Response.json({ error: String(error) }, { status: 502 });
    } finally {
      await client.end().catch(() => {});
    }
  },
};

postgres.js 时思路相同,把连接串换成 env.HYPERDRIVE.connectionString 即可。Hyperdrive 强制 TLS,Supabase 默认满足。

验证与排障

部署后用 curl 走一遍:

curl -s https://<worker>.workers.dev/notes
现象先检查恢复动作
502 且报 fetch 失败Supabase 项目是否被自动暂停在 Dashboard 恢复项目后重试
401/403service role key 是否写错或已轮换wrangler secret put 重写后重新部署
Hyperdrive 路径连不上连接串的 HOST/PORT 是否为直连地址而非池化地址换用 Dashboard 里的 direct connection 串重建 Hyperdrive
SQL 报 LISTEN 相关错误是否用了 Hyperdrive 不支持的特性改用轮询或 supabase-js 的 Realtime

远程边界与回滚

创建 Hyperdrive 配置、写入 Supabase 密钥、部署 Worker 都会修改 Cloudflare 或 Supabase 侧状态,本教程不自动执行。回滚时:先在 wrangler.jsonc 删除 hyperdrive 绑定并重新部署,再用 wrangler hyperdrive delete <id> 删除配置;若轮换过 service role key,在 Supabase Dashboard 重新生成并把旧值作废。业务数据不受代码回滚影响,无需回退。

下一步:Workers 连接 Neon;绑定与密钥的通用规则见 Bindings、环境与 Secrets

官方来源

这篇内容帮你完成目标了吗?

内测反馈只在当前浏览器生成,不会自动上传。

本页目录