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搜索路径配置存在疏漏。
问题根源
- Schema搜索路径差异:Supabase仪表盘使用的超级用户(如
postgres)搜索路径包含HTTP扩展所在的extensionsschema,而api_gateway用户默认搜索路径仅包含public,导致无法找到http_response等类型。 - 权限不足:未完全授予
api_gateway用户访问HTTP扩展的类型、函数的权限。 - 函数参数错误:原触发器函数构造
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
相关产品推荐
相关产品推荐

