You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Supabase PostgreSQL默认/rpc/端点修改为自定义端点?

自定义Supabase RPC端点的实现方案

问题背景

当前使用Supabase搭配PostgreSQL数据库,希望修改RPC默认的/rpc/端点路径,创建贴合应用需求的自定义端点,且不使用Supabase.js客户端,直接通过HTTP请求调用。已定义如下PostgreSQL函数:

-- 函数定义
CREATE OR REPLACE FUNCTION get_content(param_episodeid integer)
RETURNS JSON AS $$
DECLARE
    result JSON;
BEGIN
    -- 使用COALESCE处理无匹配行的情况
    SELECT COALESCE(json_agg(row_to_json(t)), '[]'::json) 
    INTO result
    FROM (
        SELECT id, title
        FROM episodes
        WHERE id = param_episodeid
    ) t;

    RETURN result;
END;
$$ LANGUAGE plpgsql immutable;

实现方法

Supabase本身不支持直接修改默认的/rpc/端点路径,但可以通过两种方式实现自定义端点的效果:

1. 使用Supabase边缘函数

创建边缘函数作为中间层,将自定义路径映射到RPC调用:

  • 新建边缘函数,比如命名为get-episode-content
  • 在函数内部,通过Supabase Admin SDK调用get_content函数
  • 部署后,即可通过https://<你的项目ID>.functions.supabase.co/get-episode-content这个自定义路径发起请求
  • 示例代码(TypeScript):
import { createClient } from '@supabase/supabase-js'

export default async function handler(req: Request) {
  const supabase = createClient(
    process.env.SUPABASE_URL!,
    process.env.SUPABASE_SERVICE_ROLE_KEY!
  )
  const { episodeId } = await req.json()
  const { data, error } = await supabase.rpc('get_content', { param_episodeid: episodeId })
  
  if (error) return new Response(JSON.stringify({ error: error.message }), { status: 500 })
  return new Response(JSON.stringify(data), { status: 200 })
}

2. 反向代理自定义路径

如果不想用边缘函数,可以在自建后端服务中设置反向代理:

  • 在后端路由中创建自定义路径,比如/api/episode/content
  • 当该路径收到请求时,转发到Supabase的/rpc/get_content端点,并处理参数和响应
  • 示例(Node.js + Express):
const express = require('express')
const axios = require('axios')
const app = express()

app.post('/api/episode/content', async (req, res) => {
  try {
    const { episodeId } = req.body
    const response = await axios.post(
      'https://<你的项目ID>.supabase.co/rest/v1/rpc/get_content',
      { param_episodeid: episodeId },
      {
        headers: {
          'apikey': '<你的API密钥>',
          'Authorization': 'Bearer <你的API密钥>',
          'Content-Type': 'application/json'
        }
      }
    )
    res.json(response.data)
  } catch (error) {
    res.status(error.response?.status || 500).json({ error: error.message })
  }
})

app.listen(3000, () => console.log('Server running on port 3000'))

注意事项

  • 无论哪种方式,都要确保请求携带正确的Supabase API密钥和Authorization头,权限配置需符合业务需求
  • 边缘函数部署在Supabase边缘节点,延迟更低,适合无自建后端的场景
  • 反向代理方式需要维护自建后端服务,但灵活性更高,可添加额外业务逻辑处理

内容的提问来源于stack exchange,提问作者Behnam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:20:55