【问题标题】:Excute script before cycling (Heroku node.js discord bot)骑车前执行脚本(Heroku node.js discord bot)
【发布时间】:2021-10-07 00:09:11
【问题描述】:

我正在制作一个不和谐的机器人,我正在尝试将数据保存在我的机器人始终可以访问的私人服务器中。现在我已经完成了保存和加载功能,唯一的问题是,我什么时候保存?我可以每分钟在频道中发送数据,但这会给频道发送太多垃圾邮件。我想知道是否有更有效的方法来做到这一点。

也就是说,是否有可能检测到 heroku 平台将开始循环,所以我可以让机器人在开始循环过程之前保存数据 - 有没有 heroku 提供的方法来做到这一点? (或者,也可以跟踪 heroku 循环的时间)

bot.js的一部分:

// backup when start

client.on('ready',()=>{
    console.log(`${client.user.tag} ready!`);

    client.channels.fetch(dataChannelId)
        .then(channel => {
            dataChannel = channel;
        
            console.log(dataChannel.id);
    
            dataBackup(true);
        });
});

// save - when?

dataSave(mainChannel, currentQuestionAns, currentQuestionReward, currentQuestionMessage, miliheads);

【问题讨论】:

    标签: node.js heroku discord.js


    【解决方案1】:

    似乎没有办法准确检测何时会发生循环,但是:

    来自Heroku

    循环每 24 小时发生一次(加上最多 216 分钟的随机时间,以防止应用程序的每个测功机同时重新启动)。

    此外,dyno 会根据系统和应用的整体健康状况的需要重新启动。例如,测功机管理器偶尔会检测到底层硬件出现故障,需要将您的测功机移动到新的物理位置。

    因此,理论上,Dyno 应该在骑行前 24 小时左右,这意味着您可以将清理脚本安排在大约 24 小时后运行:

    setTimeout(() => {
      dataSave(mainChannel, currentQuestionAns, currentQuestionReward, currentQuestionMessage, miliheads);
    }, 24 * 55 * 60 * 1000); // 24 hours - 5 minutes
    

    但是,如果测功机在 24 小时之前重新启动(由于硬件问题或代码错误),您可能会丢失数据。如果您想避免这种情况,您可以更频繁地保存,例如每分钟或每次值更改时,并接受垃圾邮件。

    您还可以使用Heroku v3 API 以编程方式force the dyno to restart。这可以在您备份数据后使用,以确保您的机器人使用最新数据重新启动。以这种方式重新启动也会重置 24 小时计数器:

    // example uses got, but any HTTP request package should also work
    got.delete({
      url: `https://api.heroku.com/apps/${appName}/dynos`,
      headers: {
        "Content-Type": "application/json",
        "Accept": "application/vnd.heroku+json; version=3",
        "Authorization": `Bearer ${token}`
      }
    });
    

    由于您似乎正在使用不和谐消息来备份数据,但您保存它的次数似乎并不重要,您也可以尝试editing 消息,而不是发送每次备份时都有新消息。

    function dataSave(/* ... */) {
      const backupMessage = await mainChannel.messages.fetch("id of a message sent by your bot");
      backupMessage.edit(/* ... */);
    }
    

    另一种保存数据的方法是使用云数据库,例如firebase 或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 2021-01-19
      • 2021-07-17
      • 2020-09-03
      • 2021-03-30
      • 2023-03-15
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多