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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:18:00