Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Heroku计划程序未在部署的应用程序上运行异步操作_Node.js_Heroku_Psql - Fatal编程技术网

Node.js Heroku计划程序未在部署的应用程序上运行异步操作

Node.js Heroku计划程序未在部署的应用程序上运行异步操作,node.js,heroku,psql,Node.js,Heroku,Psql,我正在尝试使用Heroku Scheduler设置一个服务,以便在worker.js文件中运行一个函数,每小时从数据库中删除旧数据。在使用“heroku run worker”部署它之后,当我在命令行上测试它时,我只会记录“STARTED”。因此,函数被执行了,但它在到达wait时立即挂起,最终刚刚结束。在本地执行函数时,它工作正常 这是我的worker.js: const db = require("./db"); const deleteOldData = async

我正在尝试使用Heroku Scheduler设置一个服务,以便在worker.js文件中运行一个函数,每小时从数据库中删除旧数据。在使用“heroku run worker”部署它之后,当我在命令行上测试它时,我只会记录“STARTED”。因此,函数被执行了,但它在到达wait时立即挂起,最终刚刚结束。在本地执行函数时,它工作正常

这是我的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 < $1`,[twoDaysAgoUTC]
    );

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

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

    console.log("FINISHED")
}

deleteOldData();
process.exit();
const db=require(“./db”);
const deleteOldData=async()=>{
设twoDaysAgoUTC=新日期(Date.now()-2*24*60*60*1000);
twoDaysAgoUTC.toutString();

console.log(“STARTED”)代码中有一个关于同步和异步代码的基本问题。 当您调用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 < $1`,[twoDaysAgoUTC]
    );

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

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

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

deleteOldData();
const db=require(“./db”);
const deleteOldData=async()=>{
设twoDaysAgoUTC=新日期(Date.now()-2*24*60*60*1000);
twoDaysAgoUTC.toutString();
console.log(“已启动”)