如何在Supabase中用TypeScript实现Firebase式用户创建触发函数?
不用PL/pgSQL实现Auth表插入时自动执行TypeScript函数
有几种可行的方案,能把业务逻辑完全放在TypeScript里,不用写复杂的PL/pgSQL:
方案1:数据库触发器+HTTP回调(PostgreSQL 用pg_net扩展)
这个方案用极简的PL/pgSQL触发器函数转发请求到你的TypeScript服务,所有业务逻辑都在TS里实现:
安装pg_net扩展
先在PostgreSQL里启用pg_net(需要超级权限):CREATE EXTENSION IF NOT EXISTS pg_net;创建极简触发器函数
这个函数只负责转发请求,完全不包含业务逻辑:CREATE OR REPLACE FUNCTION trigger_call_ts_service() RETURNS TRIGGER AS $$ BEGIN -- 异步发送POST请求到你的TS服务接口 PERFORM net.http_post( 'http://your-ts-service:3000/api/user-created', json_build_object( 'id', NEW.id, 'email', NEW.email, 'created_at', NEW.created_at )::text, 'application/json' ); RETURN NEW; END; $$ LANGUAGE plpgsql;给auth表绑定INSERT触发器
CREATE TRIGGER auth_after_insert AFTER INSERT ON auth FOR EACH ROW EXECUTE FUNCTION trigger_call_ts_service();写TypeScript服务处理请求
用Express或者NestJS写个接口接收请求,处理业务逻辑:import express from 'express'; const app = express(); app.use(express.json()); app.post('/api/user-created', async (req, res) => { const user = req.body; // 这里写你的业务逻辑:比如创建用户关联数据、发送欢迎邮件等 console.log('新用户创建:', user); res.status(200).send('处理完成'); }); app.listen(3000, () => { console.log('TS服务运行在3000端口'); });
方案2:用ORM的生命周期钩子
如果你的项目用ORM(比如Prisma、TypeORM)操作数据库,可以直接用ORM的钩子在TS里处理,完全不用碰数据库触发器:
示例:Prisma Middleware
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); // 注册全局middleware,监听User模型的create操作 prisma.$use(async (params, next) => { if (params.model === 'User' && params.action === 'create') { // 先执行数据库插入 const result = await next(params); // 插入完成后执行你的TS业务逻辑 await handleUserCreated(result); return result; } return next(params); }); // 你的业务逻辑函数 async function handleUserCreated(user: any) { console.log('新用户创建:', user); // 比如创建用户配置、发送通知等 }
示例:TypeORM @AfterInsert装饰器
import { Entity, Column, PrimaryGeneratedColumn, AfterInsert } from 'typeorm'; @Entity('auth') export class Auth { @PrimaryGeneratedColumn() id: number; @Column() email: string; @Column() created_at: Date; // 插入后自动执行 @AfterInsert() async handleUserCreated() { // 这里写你的业务逻辑 console.log('新用户创建:', this.id, this.email); // 比如调用其他服务、生成默认数据等 } }
方案3:用CDC(变更数据捕获)工具监听数据库变更
如果是分布式系统,不想修改数据库触发器,可以用Debezium这类CDC工具,监听PostgreSQL的WAL日志,捕获auth表的INSERT事件,然后触发你的TypeScript函数:
- 配置Debezium连接你的PostgreSQL,监听auth表的INSERT事件;
- Debezium将事件发送到消息队列(比如Kafka);
- 写TypeScript消费者监听Kafka消息,处理业务逻辑。
这种方案适合需要解耦数据库和业务逻辑的场景,不用在数据库里加任何触发器。
内容的提问来源于stack exchange,提问作者Kirk Strobeck
相关产品推荐
相关产品推荐

