EasyApp

开发 Supabase 后端服务

了解如何在 EasyAppSupabase 项目中开发 Supabase 后端服务

以下属于进阶内容

本地开发环境设置

启动本地 Supabase 服务

在 EasyAppSupabase 目录下运行:

cd EasyAppSupabase
npx supabase start

在下载 Docker 镜像之前,推荐您安装 Docker Desktop

第一次运行时会下载 Docker 镜像,可能需要几分钟时间。

查看服务状态

npx supabase status

swiftui_supabase-keys

这会显示所有服务的 URL 和密钥,包括:

  • API URL: http://localhost:54321
  • Database URL: postgresql://postgres:[PASSWORD]@localhost:54322/postgres
  • Secret key: 用于客户端请求

然后将 API URLSecret key 添加到 EasyAppSwiftUI/Constants/Constants.swift 文件中。

enum Supabase {
  /// Development supabase url
  #if DEBUG
    static let url = "http://localhost:54321"
    /// The anon key
    static let key ="your_anon_key_here"
  #else
}

开发 Edge Function

SupabaseEdgeFunction 项目已经内置了 easyapp 模板中所需的所有 Edge Function,您可以参考这些函数来创建您自己的函数。

使用 CLI 生成函数

npx supabase functions new my-function

这会在 supabase/functions/my-function/ 目录下创建一个基础模板:

// supabase/functions/my-function/index.ts
import "jsr:@supabase/functions-js/edge-runtime.d.ts"

Deno.serve(async (req) => {
  const { name } = await req.json()
  const data = {
    message: `Hello ${name}!`,
  }

  return new Response(
    JSON.stringify(data),
    { headers: { "Content-Type": "application/json" } },
  )
})

配置依赖

创建 deno.json 文件来管理依赖:

{
  "imports": {
    "@supabase/supabase-js": "jsr:@supabase/supabase-js@^2.50.2",
    "@openai/openai": "jsr:@openai/openai@^5.8.1"
  }
}

访问环境变量

在您的函数中,可以通过 Deno.env.get() 访问环境变量:

// 获取环境变量
const apiKey = Deno.env.get("OPENAI_API_KEY")
const customVar = Deno.env.get("YOUR_CUSTOM_VARIABLE")

使用共享工具

EasyAppSupabase 提供了预配置的共享工具,可以直接在您的函数中使用:

使用 Supabase 客户端

import {
  supabaseServiceRoleKey,
  supabaseUrl,
} from "../_shared/SupabaseClient.ts";

Deno.serve(async (req) => {
  const supabaseClient = createClient(
    supabaseUrl,
    supabaseServiceRoleKey,
  );
  
  // 获取用户认证信息
  const authHeader = req.headers.get("Authorization");
  if (!authHeader) {
    return new Response("Unauthorized", { status: 401 });
  }
  
  const token = authHeader.replace("Bearer ", "");
  const { data: user } = await supabaseClient.auth.getUser(token);
  
  if (!user) {
    return new Response("Invalid token", { status: 401 });
  }
  
  // 数据库操作
  const { data, error } = await supabaseClient
    .from('your_table')
    .select('*')
    .eq('user_id', user.user.id);
  
  return new Response(JSON.stringify(data), {
    headers: { "Content-Type": "application/json" }
  });
});

使用 OpenAI 客户端

import { openAIClient } from "../_shared/OpenAIClient.ts";
import { createClient } from "@supabase/supabase-js";

Deno.serve(async (req) => {
  const { prompt } = await req.json();
  
  const response = await openAIClient.chat.completions.create({
    model: "gpt-3.5-turbo",
    messages: [{ role: "user", content: prompt }],
  });
  
  return new Response(JSON.stringify({
    result: response.choices[0].message.content
  }), {
    headers: { "Content-Type": "application/json" }
  });
});

本地测试

配置环境变量

supabase/.env.local 文件中配置您的环境变量:

# supabase/.env.local
# OpenAI
OPENAI_API_KEY=your_openai_api_key_here


# Supabase

# supabase 本地开发使用 LOCAL_DEV 前缀
LOCAL_DEV_SUPABASE_URL=http://127.0.0.1:54321
LOCAL_DEV_SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key_here

# 其他环境变量

LOCAL_DEV_SUPABASE_SERVICE_ROLE_KEY 可以从这里获取 SERVICE_ROLE_KEY

配置数据库表

  1. 创建新的迁移文件:
npx supabase migration new your_migration_name
  1. 编辑生成的 SQL 文件在 supabase/migrations/

  2. 应用迁移:

npx supabase db push

启动函数服务

# 启动特定函数并加载环境变量
npx supabase functions serve my-function --env-file ./supabase/.env.local

# 启动所有函数并加载环境变量
npx supabase functions serve --env-file ./supabase/.env.local

函数将在 http://localhost:54321/functions/v1/my-function 运行。

测试函数

使用 curl 测试您的函数:

# 获取本地 anon key
npx supabase status

# 测试函数
curl -i --location --request POST 'http://localhost:54321/functions/v1/my-function' \
  --header 'Authorization: Bearer YOUR_LOCAL_ANON_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"name":"World"}'

查看日志

函数的日志会实时显示在终端中,帮助您调试问题。

最佳实践

安全性

  • 始终验证用户身份(除非是公开的 Webhook)
  • 使用环境变量存储敏感信息(API 密钥、数据库连接字符串等)
  • 实施适当的错误处理

故障排除

常见问题

函数无法启动

  • 确保 Docker 正在运行
  • 运行 supabase stop 然后 supabase start 重启服务

端口冲突

  • 检查 supabase status 查看占用的端口
  • 停止其他 Supabase 实例

部署失败

  • 检查函数代码语法
  • 确保所有依赖项都正确配置
  • 验证环境变量设置

环境变量无法读取

  • 确保 .env.local 文件格式正确(KEY=value
  • 启动函数时使用 --env-file 参数
  • 检查环境变量名称是否拼写正确

查看日志

# 查看函数日志
npx supabase functions logs my-function

# 实时查看日志
npx supabase functions logs my-function --follow

通过本指南,您应该能够成功地在 EasyAppSupabase 项目中创建、测试和部署 Supabase 云函数s。

要学习更多 Supabase 云函数 相关知识,请参考 Supabase 云函数 官方文档

Last updated on