最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js自動(dòng)清理過(guò)期Token的方法步驟

 更新時(shí)間:2026年05月09日 08:34:52   作者:yingyima  
你是否遇到過(guò) Token 過(guò)期導(dǎo)致用戶無(wú)法登錄的問(wèn)題?在高并發(fā)場(chǎng)景下,手動(dòng)清理顯然不是個(gè)好主意,自動(dòng)定時(shí)清理才是王道,本文通過(guò)實(shí)戰(zhàn)案例詳細(xì)講解如何在 Node.js 中實(shí)現(xiàn)定時(shí)清理過(guò)期 Token,適合收藏備查,需要的朋友可以參考下

引言

你是否遇到過(guò) Token 過(guò)期導(dǎo)致用戶無(wú)法登錄的問(wèn)題?在高并發(fā)場(chǎng)景下,手動(dòng)清理顯然不是個(gè)好主意,自動(dòng)定時(shí)清理才是王道。

業(yè)務(wù)場(chǎng)景

假設(shè)你有一個(gè)在線商城,用戶登錄后會(huì)生成一個(gè) JWT Token,有效期為 7 天。超過(guò)有效期后,Token 應(yīng)該被自動(dòng)清理,防止數(shù)據(jù)庫(kù)膨脹和提高安全性。

技術(shù)選型

  • cron:用于定時(shí)任務(wù)調(diào)度
  • bull:用于任務(wù)隊(duì)列管理
  • MongoDB:存儲(chǔ) Token

實(shí)現(xiàn)步驟

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, '連接錯(cuò)誤:'));
db.once('open', () => {
  console.log('數(shù)據(jù)庫(kù)連接成功');
});

3. 定義 Token 模型

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

4. 創(chuàng)建定時(shí)任務(wù)

使用 cron 創(chuàng)建一個(gè)定時(shí)任務(wù),每 1 小時(shí)執(zhí)行一次。

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

5. 使用 Bull 管理任務(wù)隊(duì)列

Bull 可以確保任務(wù)的可靠執(zhí)行,即使 Node.js 進(jìn)程崩潰也能恢復(fù)。

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('過(guò)期 Token 已清理');
  done();
});

6. 定時(shí)將任務(wù)加入隊(duì)列

結(jié)合 cronbull,確保任務(wù)定時(shí)加入隊(duì)列。

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

7. 監(jiān)控任務(wù)執(zhí)行

使用 Bull 的內(nèi)置監(jiān)控功能,確保任務(wù)執(zhí)行情況。

clearTokenQueue.on('completed', (job, result) => {
  console.log(`任務(wù)完成: ${job.id}, 結(jié)果: ${result}`);
});

clearTokenQueue.on('failed', (job, err) => {
  console.error(`任務(wù)失敗: ${job.id}, 錯(cuò)誤: ${err}`);
});

8. 高可用配置

在生產(chǎn)環(huán)境中,確保定時(shí)任務(wù)的高可用性。

  • Redis 集群:配置 Redis 集群,確保任務(wù)隊(duì)列的高可用性。
  • 多實(shí)例:在多臺(tái)服務(wù)器上運(yùn)行定時(shí)任務(wù),確保任務(wù)不會(huì)因?yàn)閱吸c(diǎn)故障而失敗。

9. 部署和測(cè)試

部署到生產(chǎn)環(huán)境前,務(wù)必進(jìn)行充分的測(cè)試。

  • 本地測(cè)試:使用 nodemon 進(jìn)行本地測(cè)試,確保代碼無(wú)誤。
  • Docker:使用 Docker 部署,確保環(huán)境一致性。
# Dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]

10. 日志記錄

記錄日志,便于問(wèn)題排查和監(jiān)控。

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('過(guò)期 Token 已清理');
    done();
  } catch (err) {
    logger.error(`清理 Token 失敗: ${err}`);
    done(err);
  }
});

11. 安全性考慮

  • Token 簽名:確保 JWT Token 的簽名安全。
  • 環(huán)境變量:將敏感信息(如數(shù)據(jù)庫(kù)連接字符串)存儲(chǔ)在環(huán)境變量中。
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. 優(yōu)化建議

  • 索引優(yōu)化:在 expiresAt 字段上添加索引,提高查詢效率。
  • 任務(wù)調(diào)度:根據(jù)業(yè)務(wù)需求調(diào)整 cron 的調(diào)度頻率。
const tokenSchema = new mongoose.Schema({
  token: String,
  expiresAt: { type: Date, index: { expires: 1 } } // 添加索引
});

13. 常見問(wèn)題

  • Token 未被清理:檢查 expiresAt 字段是否正確設(shè)置。
  • 任務(wù)執(zhí)行失敗:查看日志文件,確保 Redis 連接無(wú)誤。

14. 其他工具推薦

如果你對(duì) cronbull 的組合感到復(fù)雜,可以考慮使用 Hey CronHey Cron 是一個(gè)高性能、易用的定時(shí)任務(wù)管理工具,支持多種任務(wù)調(diào)度方式和集成方式,能夠顯著簡(jiǎn)化任務(wù)管理的復(fù)雜度。

# 安裝 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('過(guò)期 Token 已清理');
});

clearTokenCron.start();

15. 總結(jié)

通過(guò)上述步驟,你可以在 Node.js 中實(shí)現(xiàn)高效、穩(wěn)定的定時(shí)清理過(guò)期 Token 功能。結(jié)合 Hey Cron,可以進(jìn)一步簡(jiǎn)化任務(wù)管理,提高系統(tǒng)的可維護(hù)性和可靠性。

以上就是Node.js自動(dòng)清理過(guò)期Token的方法步驟的詳細(xì)內(nèi)容,更多關(guān)于Node.js自動(dòng)清理過(guò)期Token的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 測(cè)試驅(qū)動(dòng)ChatGPT編程示例詳解

    測(cè)試驅(qū)動(dòng)ChatGPT編程示例詳解

    這篇文章主要為大家介紹了測(cè)試驅(qū)動(dòng)ChatGPT編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Node.js中的cluster模塊深入解讀

    Node.js中的cluster模塊深入解讀

    NodeJS引入了Cluster模塊試圖簡(jiǎn)化這些體力勞動(dòng),使用Cluster模塊可以運(yùn)行并管理多個(gè)實(shí)例進(jìn)程,下面這篇文章主要給大家介紹了關(guān)于Node.js中cluster模塊的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-06-06
  • 詳解如何在NodeJS項(xiàng)目中優(yōu)雅的使用ES6

    詳解如何在NodeJS項(xiàng)目中優(yōu)雅的使用ES6

    本篇文章主要介紹了詳解如何在NodeJS項(xiàng)目中優(yōu)雅的使用ES6,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • nodejs+mongodb+vue前后臺(tái)配置ueditor的示例代碼

    nodejs+mongodb+vue前后臺(tái)配置ueditor的示例代碼

    本篇文章主要介紹了nodejs+mongodb+vue前后臺(tái)配置ueditor的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Node.js實(shí)現(xiàn)連接mysql數(shù)據(jù)庫(kù)功能示例

    Node.js實(shí)現(xiàn)連接mysql數(shù)據(jù)庫(kù)功能示例

    這篇文章主要介紹了Node.js實(shí)現(xiàn)連接mysql數(shù)據(jù)庫(kù)功能,簡(jiǎn)單分析了nodejs連接數(shù)據(jù)庫(kù)的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • 淺析Node.js中的內(nèi)存泄漏問(wèn)題

    淺析Node.js中的內(nèi)存泄漏問(wèn)題

    這篇文章主要介紹了淺析Node.js中的內(nèi)存泄漏問(wèn)題,Node.js是使JavaScript應(yīng)用在服務(wù)器端運(yùn)行的一款框架,需要的朋友可以參考下
    2015-06-06
  • Node.js中的不安全跳轉(zhuǎn)如何防御詳解

    Node.js中的不安全跳轉(zhuǎn)如何防御詳解

    安全是不容忽視的,每個(gè)開發(fā)者都知道它非常重要,真正嚴(yán)肅對(duì)待它的卻沒(méi)有幾人。下面這篇文章主要給大家介紹了關(guān)于Node.js中不安全跳轉(zhuǎn)如何防御的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì)。需要的朋友可以參考下
    2018-10-10
  • express+multer上傳圖片打開亂碼問(wèn)題及解決

    express+multer上傳圖片打開亂碼問(wèn)題及解決

    這篇文章主要介紹了express+multer上傳圖片打開亂碼問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Node.js中的異步生成器與異步迭代詳解

    Node.js中的異步生成器與異步迭代詳解

    這篇文章主要給大家介紹了關(guān)于Node.js中異步生成器與異步迭代的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Node.js中Bootstrap-table的兩種分頁(yè)的實(shí)現(xiàn)方法

    Node.js中Bootstrap-table的兩種分頁(yè)的實(shí)現(xiàn)方法

    這篇文章主要介紹了Node.js中Bootstrap-table的兩種分頁(yè)的使用方法,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

许昌县| 治多县| 彩票| 化隆| 恭城| 神农架林区| 扎鲁特旗| 甘孜| 临泽县| 鹿邑县| 娄烦县| 聊城市| 革吉县| 曲松县| 古蔺县| 绩溪县| 华亭县| 秦皇岛市| 马尔康县| 阿拉善盟| 隆回县| 双辽市| 咸宁市| 齐河县| 西充县| 稷山县| 盐城市| 陵水| 廊坊市| 莒南县| 达孜县| 元朗区| 昌吉市| 东阳市| 万年县| 灵丘县| 商水县| 新泰市| 蒙山县| 祁连县| 买车|