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

Supabase+NestJS HTTP触发器报错:http_response类型不存在

解决Supabase触发器中"http_response类型不存在"的问题

我在基于Supabase + NestJS构建REST API时,遇到了触发器异常:当通过Supabase仪表盘手动插入test表数据时,触发器能正常调用API;但通过NestJS的TypeORM模块以api_gateway用户身份插入时,抛出QueryFailedError: type "http_response" does not exist错误。

使用Postgres HTTP扩展实现表操作触发API调用,操作步骤包括创建用户、表、触发器函数及授权,但权限和Schema搜索路径配置存在疏漏。

问题根源

  1. Schema搜索路径差异:Supabase仪表盘使用的超级用户(如postgres)搜索路径包含HTTP扩展所在的extensions schema,而api_gateway用户默认搜索路径仅包含public,导致无法找到http_response等类型。
  2. 权限不足:未完全授予api_gateway用户访问HTTP扩展的类型、函数的权限。
  3. 函数参数错误:原触发器函数构造http_request时参数传递有误,且未显式指定扩展的Schema。

修复步骤

1. 确认HTTP扩展的安装位置

执行以下SQL查询扩展的安装Schema:

SELECT extname, nspname FROM pg_extension WHERE extname = 'http';

通常结果会显示nspname为extensions,后续操作以此为准。

2. 修正api_gateway用户的搜索路径

将扩展所在Schema添加到用户的搜索路径中:

ALTER USER api_gateway SET search_path = public, extensions, net;

3. 补充权限配置

授予api_gateway用户访问扩展Schema及函数的权限:

-- 授予扩展Schema的使用权限
GRANT USAGE ON SCHEMA extensions TO api_gateway;
-- 授予扩展中所有函数的执行权限
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA extensions TO api_gateway;
-- 修正之前错误的函数授权(授权test_post而非publish_to_pubsub)
GRANT ALL ON FUNCTION public.test_post() TO api_gateway;

4. 重构触发器函数

修改函数,显式指定扩展Schema,并修正http_request的参数构造:

CREATE OR REPLACE FUNCTION public.test_post()
returns trigger as $$

declare hres extensions.http_response;
declare trigger_payload jsonb;

begin
  trigger_payload = jsonb_build_object(
    'old_record', OLD,
    'record', NEW,
    'type', TG_OP,
    'table', TG_TABLE_NAME,
    'schema', TG_TABLE_SCHEMA
  );

  -- 显式调用extensions下的http函数,正确构造http_request参数
  select * into hres from extensions.http(
    (
      'POST',
      'your-rest-endpoint-url', -- 替换为实际API地址
      ARRAY[
        extensions.http_header('Authorization', concat('Bearer ', 'your-auth-token')),
        extensions.http_header('Content-Type', 'application/json')
      ],
      'application/json', -- 指定Content-Type
      trigger_payload::text -- 将jsonb转为文本作为请求体
    )::extensions.http_request
  );

  return new;
end;
$$ language plpgsql security definer;

5. 重新创建触发器(可选)

如果之前的触发器已存在,可重新执行创建语句确保生效:

DROP TRIGGER IF EXISTS ON_CREATE_test on "public"."test";
CREATE TRIGGER ON_CREATE_test
AFTER INSERT ON public.test
FOR EACH ROW EXECUTE PROCEDURE public.test_post();

验证

完成上述步骤后,通过NestJS的TypeORM模块插入数据,触发器应能正常调用API,不再抛出类型不存在的错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:30:58