如何使用node和node-postgres实现过期邮箱验证令牌定时清理
实现方案
我们可以通过两种方式实现和原MySQL EVENT对等的功能,你可以根据自己的数据库权限选择:
方案1:PostgreSQL原生定时任务(和原MySQL逻辑最接近)
PostgreSQL没有内置的EVENT功能,需要借助官方扩展pg_cron实现同等的数据库层定时任务,操作步骤如下:
- 首先安装启用
pg_cron扩展(需要数据库超级用户权限):
CREATE EXTENSION IF NOT EXISTS pg_cron;
- 执行以下语句创建定时清理任务:
SELECT cron.schedule( 'expireToken', -- 自定义任务名称 '0 0 * * *', -- cron表达式,代表每天0点执行1次 $$ DELETE FROM verification_tokens WHERE "createdAt" < NOW() - INTERVAL '1 day'; $$ );
注意:如果需要删除已创建的任务,执行SELECT cron.unschedule('expireToken');即可
方案2:Node层实现定时任务(无数据库超级权限时首选)
如果没有数据库超级用户权限,我们可以在Node服务中通过定时调度实现需求,需要用到node-postgres做数据库操作,node-cron做定时调度:
- 安装依赖:
npm install pg node-cron
- 实现代码示例:
const { Pool } = require('pg'); const cron = require('node-cron'); // 初始化PostgreSQL连接池,替换为你自己的数据库配置 const pool = new Pool({ user: 'db_user', host: '127.0.0.1', database: 'db_name', password: 'db_password', port: 5432, }); // 过期令牌清理逻辑 const cleanExpiredTokens = async () => { try { await pool.query(`DELETE FROM verification_tokens WHERE "createdAt" < NOW() - INTERVAL '1 day'`); console.log('过期邮箱验证令牌清理完成'); } catch (err) { console.error('清理过期令牌失败:', err); } }; // 配置每天0点执行一次清理 cron.schedule('0 0 * * *', cleanExpiredTokens); // 可选:服务启动时先执行一次清理 cleanExpiredTokens();
如果你的Node服务是多实例部署,建议加分布式锁避免重复执行清理,或者直接选用方案1的数据库层定时任务
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

