在给定的时间间隔后带走角色

时间:2021-02-25 02:14:39

标签: javascript node.js discord.js

 setTimeout(() => {
            targets.forEach(target => target.roles.remove(arole));
            message.channel.send(`Removed ${arole}`);

        }, RoleTime);
    }
}

我使用上面的代码片段在提到的时间之后取消提到的用户的角色。它运行良好(我使用 ms 将 RoleTime 存储在 Milis 中)。但是当时间接近 12 小时时,机器人似乎没有回复并取消角色(托管在 Heroku 上)。知道为什么吗?实现这一目标的其他方法是什么?

1 个答案:

答案 0 :(得分:0)

setTimeout 在像 heroku 这样的服务上不能长时间工作,一般来说,无论如何将 setTimeout 用于这样的操作是一个坏主意。

有些人说要使用 cron 作业来做这样的事情,但由于不和谐网关的性质,这可能不是一个好主意。

考虑将到期作业存储在某种持久性数据库(sql、mongo 等)中 在您的机器人中,每隔一段时间(30 秒、60 分钟)等:

  1. 查询数据库,获取所有已过或等于到期时间的到期作业

    SELECT profile_snowflake,role_snowflake FROM expiry_jobs WHERE expiry_time <= ?

  2. 遍历每个到期作业并删除角色

  3. 重新安排任务

这允许机器人在不同的进程中执行到期作业 - 使用 heroku 等服务,机器人可以随机重启,这将完全重置机器人的状态,因此您需要使用某种持久性数据存储到期工作。