边缘函数

直接连接Postgres

从边缘函数连接Postgres数据库。


通过使用 supabase-js 客户端从边缘函数连接您的 Postgres 数据库。 您也可以使用其他 Postgres 客户端,例如 Deno Postgres

使用 supabase-js

supabase-js 客户端是连接 Supabase 数据库的绝佳选择,因为它处理了行级安全(Row Level Security)的授权,并自动将响应格式化为 JSON。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { createClient } from 'jsr:@supabase/supabase-js@2'Deno.serve(async (req) => { try { const supabase = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_ANON_KEY') ?? '', { global: { headers: { Authorization: req.headers.get('Authorization')! } } } ) const { data, error } = await supabase.from('countries').select('*') if (error) { throw error } return new Response(JSON.stringify({ data }), { headers: { 'Content-Type': 'application/json' }, status: 200, }) } catch (err) { return new Response(String(err?.message ?? err), { status: 500 }) }})

使用 Postgres 客户端

由于边缘函数是服务器端技术,因此可以安全地使用任何流行的 Postgres 客户端直接连接数据库。这意味着您可以从边缘函数中执行原始 SQL 查询。

以下是使用 Deno Postgres 驱动连接数据库并执行原始 SQL 的方法。

查看完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import * as postgres from 'https://deno.land/x/postgres@v0.17.0/mod.ts'// 从环境变量 "SUPABASE_DB_URL" 获取连接字符串const databaseUrl = Deno.env.get('SUPABASE_DB_URL')!// 创建一个包含三个延迟建立的连接的数据库连接池const pool = new postgres.Pool(databaseUrl, 3, true)Deno.serve(async (_req) => { try { // 从连接池中获取一个连接 const connection = await pool.connect() try { // 执行查询 const result = await connection.queryObject`SELECT * FROM animals` const animals = result.rows // [{ id: 1, name: "Lion" }, ...] // 将结果格式化为美观的 JSON 字符串 const body = JSON.stringify( animals, (key, value) => (typeof value === 'bigint' ? value.toString() : value), 2 ) // 返回带有正确内容类型头的响应 return new Response(body, { status: 200, headers: { 'Content-Type': 'application/json; charset=utf-8' }, }) } finally { // 将连接释放回连接池 connection.release() } } catch (err) { console.error(err) return new Response(String(err?.message ?? err), { status: 500 }) }})

使用 Drizzle

您可以将 Drizzle 与 Postgres.js 结合使用。两者都可以直接从 npm 加载:

1
2
3
4
5
6
7
{ "imports": { "drizzle-orm": "npm:drizzle-orm@0.29.1", "drizzle-orm/": "npm:/drizzle-orm@0.29.1/", "postgres": "npm:postgres@3.4.3" }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { drizzle } from 'drizzle-orm/postgres-js'import postgres from 'postgres'import { countries } from '../_shared/schema.ts'const connectionString = Deno.env.get('SUPABASE_DB_URL')!Deno.serve(async (_req) => { // 禁用预取,因为"Transaction"池模式不支持此功能 const client = postgres(connectionString, { prepare: false }) const db = drizzle(client) const allCountries = await db.select().from(countries) return Response.json(allCountries)})

完整示例可在 GitHub 上找到。

SSL 连接

已部署的边缘函数已预先配置为使用 SSL 连接到 Supabase 数据库。您无需添加任何额外配置。

如果您想在本地开发时使用 SSL 连接,请按照以下步骤操作:

1
2
SSL_CERT_FILE=/path/to/cert.crt # 设置为下载证书的路径DENO_TLS_CA_STORE=mozilla,system