Supabase Edge Functions概述 #
一、Edge Functions概述 #
1.1 什么是Edge Functions #
text
Edge Functions特点
├── 基于Deno运行时
├── 边缘计算,全球部署
├── TypeScript原生支持
├── 无服务器架构
├── 自动扩展
└── 低延迟响应
1.2 使用场景 #
| 场景 | 说明 |
|---|---|
| API端点 | 自定义API |
| Webhooks | 接收第三方回调 |
| 定时任务 | 定期执行任务 |
| 数据处理 | 复杂数据转换 |
| 第三方集成 | 调用外部API |
| 认证逻辑 | 自定义认证流程 |
1.3 架构图 #
text
┌─────────────────────────────────────────────────────────────┐
│ 客户端请求 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Edge Network │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Edge 1 │ │ Edge 2 │ │ Edge 3 │ 全球分布 │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Deno Runtime │
│ 执行Edge Function代码 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Supabase Services │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Database │ │ Auth │ │ Storage │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
二、Deno运行时 #
2.1 Deno特点 #
text
Deno特点
├── 安全默认
├── TypeScript原生支持
├── ES模块标准
├── 去中心化导入
├── 内置工具链
└── 现代异步API
2.2 支持的API #
typescript
// Web标准API
Request
Response
URL
URLSearchParams
Headers
FormData
// Deno API
Deno.serve
Deno.env
Deno.readTextFile
Deno.writeTextFile
三、函数结构 #
3.1 基本结构 #
typescript
// 函数入口
Deno.serve(async (req: Request) => {
const { name } = await req.json()
return new Response(
JSON.stringify({ message: `Hello ${name}!` }),
{
headers: {
'Content-Type': 'application/json',
},
}
)
})
3.2 处理HTTP方法 #
typescript
Deno.serve(async (req: Request) => {
const method = req.method
const url = new URL(req.url)
switch (method) {
case 'GET':
return handleGet(req)
case 'POST':
return handlePost(req)
case 'PUT':
return handlePut(req)
case 'DELETE':
return handleDelete(req)
default:
return new Response('Method not allowed', { status: 405 })
}
})
四、环境变量 #
4.1 访问环境变量 #
typescript
const supabaseUrl = Deno.env.get('SUPABASE_URL')!
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
4.2 设置环境变量 #
bash
# 本地环境变量
# supabase/.env
SUPABASE_URL=http://localhost:54321
SUPABASE_SERVICE_ROLE_KEY=your-key
# 远程环境变量
supabase secrets set MY_SECRET=value
五、访问Supabase服务 #
5.1 创建客户端 #
typescript
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
const supabase = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
)
Deno.serve(async (req) => {
const { data, error } = await supabase
.from('users')
.select('*')
return new Response(JSON.stringify({ data, error }), {
headers: { 'Content-Type': 'application/json' },
})
})
5.2 获取用户信息 #
typescript
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
Deno.serve(async (req) => {
const supabase = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_ANON_KEY')!,
{
global: {
headers: { Authorization: req.headers.get('Authorization')! },
},
}
)
const { data: { user } } = await supabase.auth.getUser()
return new Response(JSON.stringify({ user }), {
headers: { 'Content-Type': 'application/json' },
})
})
六、错误处理 #
6.1 标准错误响应 #
typescript
Deno.serve(async (req) => {
try {
const body = await req.json()
if (!body.name) {
return new Response(
JSON.stringify({ error: 'Name is required' }),
{ status: 400, headers: { 'Content-Type': 'application/json' } }
)
}
return new Response(
JSON.stringify({ message: `Hello ${body.name}` }),
{ headers: { 'Content-Type': 'application/json' } }
)
} catch (error) {
return new Response(
JSON.stringify({ error: 'Internal server error' }),
{ status: 500, headers: { 'Content-Type': 'application/json' } }
)
}
})
七、日志 #
7.1 输出日志 #
typescript
Deno.serve(async (req) => {
console.log('Request received:', req.method, req.url)
const body = await req.json()
console.log('Request body:', body)
// 处理逻辑...
console.log('Response sent')
return new Response('OK')
})
7.2 查看日志 #
bash
# 查看函数日志
supabase functions logs hello-world
# Dashboard查看
# Dashboard > Edge Functions > [Function] > Logs
八、限制 #
8.1 资源限制 #
| 限制 | 值 |
|---|---|
| 内存 | 256MB |
| CPU时间 | 2秒 |
| 请求大小 | 6MB |
| 响应大小 | 6MB |
| 冷启动 | ~100ms |
九、最佳实践 #
9.1 代码组织 #
text
supabase/
├── functions/
│ ├── hello-world/
│ │ └── index.ts
│ ├── send-email/
│ │ └── index.ts
│ └── _shared/
│ └── supabase.ts
9.2 共享代码 #
typescript
// functions/_shared/supabase.ts
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
export function getSupabaseClient(req: Request) {
return createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_ANON_KEY')!,
{
global: {
headers: { Authorization: req.headers.get('Authorization')! },
},
}
)
}
十、总结 #
Edge Functions要点:
| 概念 | 说明 |
|---|---|
| 运行时 | Deno |
| 入口 | Deno.serve() |
| 环境变量 | Deno.env.get() |
| 客户端 | createClient() |
下一步,让我们学习创建与部署!
最后更新:2026-03-28