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