Node.js自动清理过期Token的方法步骤

 更新时间:2026年05月09日 08:34:52   作者:yingyima  
你是否遇到过 Token 过期导致用户无法登录的问题?在高并发场景下,手动清理显然不是个好主意,自动定时清理才是王道,本文通过实战案例详细讲解如何在 Node.js 中实现定时清理过期 Token,适合收藏备查,需要的朋友可以参考下

引言

你是否遇到过 Token 过期导致用户无法登录的问题?在高并发场景下,手动清理显然不是个好主意,自动定时清理才是王道。

业务场景

假设你有一个在线商城,用户登录后会生成一个 JWT Token,有效期为 7 天。超过有效期后,Token 应该被自动清理,防止数据库膨胀和提高安全性。

技术选型

  • cron:用于定时任务调度
  • bull:用于任务队列管理
  • MongoDB:存储 Token

实现步骤

1. 安装依赖

npm install cron bull mongoose

2. 连接 MongoDB

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/your-database', { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on('error', console.error.bind(console, '连接错误:'));
db.once('open', () => {
  console.log('数据库连接成功');
});

3. 定义 Token 模型

const tokenSchema = new mongoose.Schema({
  token: String,
  expiresAt: { type: Date, index: { expires: 1 } }
});
const Token = mongoose.model('Token', tokenSchema);

4. 创建定时任务

使用 cron 创建一个定时任务,每 1 小时执行一次。

const cron = require('cron');
const ClearTokenJob = new cron.CronJob('0 * * * *', async () => {
  await Token.deleteMany({ expiresAt: { $lt: new Date() } });
  console.log('过期 Token 已清理');
});
ClearTokenJob.start();

5. 使用 Bull 管理任务队列

Bull 可以确保任务的可靠执行,即使 Node.js 进程崩溃也能恢复。

const Queue = require('bull');
const clearTokenQueue = new Queue('clearTokenQueue', 'redis://127.0.0.1:6379');

clearTokenQueue.process(async (job, done) => {
  await Token.deleteMany({ expiresAt: { $lt: new Date() } });
  console.log('过期 Token 已清理');
  done();
});

6. 定时将任务加入队列

结合 cronbull,确保任务定时加入队列。

const cron = require('cron');
const ClearTokenJob = new cron.CronJob('0 * * * *', () => {
  clearTokenQueue.add();
});
ClearTokenJob.start();

7. 监控任务执行

使用 Bull 的内置监控功能,确保任务执行情况。

clearTokenQueue.on('completed', (job, result) => {
  console.log(`任务完成: ${job.id}, 结果: ${result}`);
});

clearTokenQueue.on('failed', (job, err) => {
  console.error(`任务失败: ${job.id}, 错误: ${err}`);
});

8. 高可用配置

在生产环境中,确保定时任务的高可用性。

  • Redis 集群:配置 Redis 集群,确保任务队列的高可用性。
  • 多实例:在多台服务器上运行定时任务,确保任务不会因为单点故障而失败。

9. 部署和测试

部署到生产环境前,务必进行充分的测试。

  • 本地测试:使用 nodemon 进行本地测试,确保代码无误。
  • Docker:使用 Docker 部署,确保环境一致性。
# Dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]

10. 日志记录

记录日志,便于问题排查和监控。

const winston = require('winston');
const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

clearTokenQueue.process(async (job, done) => {
  try {
    await Token.deleteMany({ expiresAt: { $lt: new Date() } });
    logger.info('过期 Token 已清理');
    done();
  } catch (err) {
    logger.error(`清理 Token 失败: ${err}`);
    done(err);
  }
});

11. 安全性考虑

  • Token 签名:确保 JWT Token 的签名安全。
  • 环境变量:将敏感信息(如数据库连接字符串)存储在环境变量中。
const secret = process.env.SECRET_KEY;
const jwt = require('jsonwebtoken');

const generateToken = (userId) => {
  const token = jwt.sign({ userId }, secret, { expiresIn: '7d' });
  return token;
};

const verifyToken = (token) => {
  try {
    const decoded = jwt.verify(token, secret);
    return decoded;
  } catch (err) {
    return null;
  }
};

12. 优化建议

  • 索引优化:在 expiresAt 字段上添加索引,提高查询效率。
  • 任务调度:根据业务需求调整 cron 的调度频率。
const tokenSchema = new mongoose.Schema({
  token: String,
  expiresAt: { type: Date, index: { expires: 1 } } // 添加索引
});

13. 常见问题

  • Token 未被清理:检查 expiresAt 字段是否正确设置。
  • 任务执行失败:查看日志文件,确保 Redis 连接无误。

14. 其他工具推荐

如果你对 cronbull 的组合感到复杂,可以考虑使用 Hey CronHey Cron 是一个高性能、易用的定时任务管理工具,支持多种任务调度方式和集成方式,能够显著简化任务管理的复杂度。

# 安装 Hey Cron
npm install hey-cron
const { Cron } = require('hey-cron');

const clearTokenCron = new Cron('0 * * * *', async () => {
  await Token.deleteMany({ expiresAt: { $lt: new Date() } });
  logger.info('过期 Token 已清理');
});

clearTokenCron.start();

15. 总结

通过上述步骤,你可以在 Node.js 中实现高效、稳定的定时清理过期 Token 功能。结合 Hey Cron,可以进一步简化任务管理,提高系统的可维护性和可靠性。

以上就是Node.js自动清理过期Token的方法步骤的详细内容,更多关于Node.js自动清理过期Token的资料请关注脚本之家其它相关文章!

相关文章

  • 测试驱动ChatGPT编程示例详解

    测试驱动ChatGPT编程示例详解

    这篇文章主要为大家介绍了测试驱动ChatGPT编程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Node.js中的cluster模块深入解读

    Node.js中的cluster模块深入解读

    NodeJS引入了Cluster模块试图简化这些体力劳动,使用Cluster模块可以运行并管理多个实例进程,下面这篇文章主要给大家介绍了关于Node.js中cluster模块的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-06-06
  • 详解如何在NodeJS项目中优雅的使用ES6

    详解如何在NodeJS项目中优雅的使用ES6

    本篇文章主要介绍了详解如何在NodeJS项目中优雅的使用ES6,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • nodejs+mongodb+vue前后台配置ueditor的示例代码

    nodejs+mongodb+vue前后台配置ueditor的示例代码

    本篇文章主要介绍了nodejs+mongodb+vue前后台配置ueditor的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Node.js实现连接mysql数据库功能示例

    Node.js实现连接mysql数据库功能示例

    这篇文章主要介绍了Node.js实现连接mysql数据库功能,简单分析了nodejs连接数据库的操作步骤与相关实现技巧,需要的朋友可以参考下
    2017-09-09
  • 浅析Node.js中的内存泄漏问题

    浅析Node.js中的内存泄漏问题

    这篇文章主要介绍了浅析Node.js中的内存泄漏问题,Node.js是使JavaScript应用在服务器端运行的一款框架,需要的朋友可以参考下
    2015-06-06
  • Node.js中的不安全跳转如何防御详解

    Node.js中的不安全跳转如何防御详解

    安全是不容忽视的,每个开发者都知道它非常重要,真正严肃对待它的却没有几人。下面这篇文章主要给大家介绍了关于Node.js中不安全跳转如何防御的相关资料,文中通过示例代码介绍的非常详细。需要的朋友可以参考下
    2018-10-10
  • express+multer上传图片打开乱码问题及解决

    express+multer上传图片打开乱码问题及解决

    这篇文章主要介绍了express+multer上传图片打开乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Node.js中的异步生成器与异步迭代详解

    Node.js中的异步生成器与异步迭代详解

    这篇文章主要给大家介绍了关于Node.js中异步生成器与异步迭代的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Node.js中Bootstrap-table的两种分页的实现方法

    Node.js中Bootstrap-table的两种分页的实现方法

    这篇文章主要介绍了Node.js中Bootstrap-table的两种分页的使用方法,需要的朋友可以参考下
    2017-09-09

最新评论