Heroku Scheduler 不是 运行 已部署应用程序的异步操作

Heroku Scheduler is not running asynchronous actions on deployed app

我正在尝试使用 Heroku Scheduler 设置一项服务,以便 运行 我的 worker.js 文件中的一个函数每小时从我的数据库中删除旧数据。当我在使用“heroku 运行 worker”部署后在命令行上测试它时,我只记录了“STARTED”。所以这个函数被执行了,但是它一遇到等待就会挂起并最终结束。在本地执行函数时它工作正常。

这是我的 worker.js:

const db = require("./db");

const deleteOldData = async () => {
    let twoDaysAgoUTC = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);
    twoDaysAgoUTC.toUTCString();
    console.log("STARTED") <- only this line gets logged
    await db.query(
        `DELETE FROM chat_messages WHERE timestamp < `,[twoDaysAgoUTC]
    );

    await db.query(
        `DELETE FROM guests
        WHERE group_chat_id IN (
            SELECT group_chat_id FROM group_chats
            WHERE timestamp < 
        )`,[twoDaysAgoUTC]
    );

    await db.query(
        `DELETE FROM group_chats WHERE timestamp < `,[twoDaysAgoUTC]
    );

    console.log("FINISHED")
}

deleteOldData();
process.exit();

您在有关同步和异步代码的代码中存在基本问题。 当您调用 deleteOldData() 时,它将 运行 异步并且不会等到它完成执行,而是会继续执行 process.exit() 这将在没有完成任务的情况下终止进程。

解决办法是在deleteOldData函数最后调用exit命令

const db = require("./db");

const deleteOldData = async () => {
    let twoDaysAgoUTC = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);
    twoDaysAgoUTC.toUTCString();
    console.log("STARTED") <- only this line gets logged
    await db.query(
        `DELETE FROM chat_messages WHERE timestamp < `,[twoDaysAgoUTC]
    );

    await db.query(
        `DELETE FROM guests
        WHERE group_chat_id IN (
            SELECT group_chat_id FROM group_chats
            WHERE timestamp < 
        )`,[twoDaysAgoUTC]
    );

    await db.query(
        `DELETE FROM group_chats WHERE timestamp < `,[twoDaysAgoUTC]
    );

    console.log("FINISHED");
    process.exit();
}

deleteOldData();