首页 > 解决方案 > 如何使用 cronjob (node-cron) 修复 mysql 错误

问题描述

我使用 node-cron 每 12 点午夜运行一个 cron 作业,正在运行的作业是增加用户表上的一些数据,现在的问题是该作业将运行两次。

例如,我想增加 15,在 12 点之后,它将变为 17 而不是 16。

已尽力检测问题,我无法。

当我停止 Nodejs 应用程序时,MySQL 数据库会不断更新,而已经关闭了 nodejs 应用程序,这是正在运行的工作

const CronJob = require('cron').CronJob;
const logger = require("../helpers/logger");
const { updateUser } = require("../helpers/user");
const db = require("../models/db");



const job = new CronJob('* * * * *', async function() {
    
    db.query("UPDATE sponsored_posts SET post_status = 0", (err, data) => {
        if (err) logger.debug(err)
    });

    db.query("DELETE FROM sponsored_posts", (err, data) => {
        if (err) logger.debug(err)
    });


    //EXPIRING USER
    db.query("SELECT * FROM all_users WHERE membership_expired > 0", async (err, data) => {
        if (data.length > 0) {
            //FIlter Through All User
            //Deduct While They Havent Expired
            await data.map(async user => {
                await updateUser({
                        uid: parseInt(user.uid),
                        membership_expired: user.membership_expired - 1
                })
                
            })
        }
    })
    
    db.query("SELECT * FROM all_users WHERE membership_expired = 0", async (err, data) => {
        if (data.length > 0) {
            //FIlter Through All User
            //Set Can Purchase To 1
            await data.map(async user => {
                await updateUser({
                    uid: parseInt(user.uid),
                    can_purchase: 1
                })
                
            })
        }
    });

    
    
    
}, null, false, "Africa/Lagos");

job.start();

标签: mysqlnode.jsidempotentnode-cron

解决方案


如果你使用的是 Linux 系统,你可以使用 crontab 命令来设置你的 cronJob

  1. 创建一个.sh文件

例如,your-cron.sh
// 编写你的 cron 脚本执行
命令 node youscript.js
//或
npm run yourscript

确保您授予执行权限
chmod +x your-cron.sh

  1. 在 crontab 中设置你的 cron

使用以下命令在 crontab 中设置您的 cron

crontab -e

0 0 * * * /your/absoulute/path/your-cron.sh >> /your/absoulute/path/logs/your-cron-output.log 2>&1

编写命令并保存它使用 crontab -l 确保它被正确保存

https://crontab.guru/是一个帮助您安排 cron 的站点。

0 0 * * * 表示 Cron 每天 00:00 运行。


推荐阅读