首页 > 解决方案 > discordjs setInterval 不更新 json 文件

问题描述

我想使用机器人在网站上显示不和谐公会的在线/总成员。

为了在网站上显示数据,我想我可以使用 jQuery 从 json 文件中提取 JSON 数据,所以我的朋友制作了一个托管在网站上的 JSON 数据库。在 json 文件中,机器人应该每 3 秒在字段中写入在线成员和总成员"online" "total"

问题是 JSON 数据不是每 3 秒更新一次。我尝试咨询 discord.js 文档,但没有帮助。请注意,我不知道 javascript,因此我很难找到编写代码的解决方案。

这是机器人的代码:index.js 代码 这是config.jsondb.json

我认为问题出在 db.json 中setInterval,因为 db.json 应该每 3 秒更新一次,并在http://example.com/db.json向我显示更新后的结果。

此外,db.json 中的数据仅在机器人启动时更新。

源代码:

const Discord = require("discord.js");
const config = require("/config.json");
const client = new Discord.Client();
const low = require('lowdb')
const FileSync = require('lowdb/adapters/FileSync')
const adapter = new FileSync('db.json')
const db = low(adapter)
const database = require("./db.json")

client.on("ready", () => {
console.log(`
CONNECTED!
[${client.user.tag}]
`)
    let onM = client.guilds.get(config.g).members.filter(member => member.user.presence.status !== "offline").size
    let totM = client.guilds.get(config.g).memberCount


    db.get("members")
        .find({id: "1", online: getOnline(), total: getTotal()})
        .assign({id: "1", online: onM, total: totM})
        .write()

    setInterval(() => {
        db.get("members")
        .find({id: "1", online: getOnline(), total: getTotal()})
        .assign({id: "1", online: onM, total: totM})
        .write()
    }, 3000)
        function getOnline() {
            return database.members.find(z => z.id === "1").online
        };

        function getTotal() {
            return database.members.find(z => z.id === "1").total

        }

    })

client.login(config.token)

配置文件

{
    "token":"BotTOKEN",
    "g":"GuildID"
}

db.json

{
  "members": [
    {
      "id": "1",
      "online": 51,
      "total": 216
    }
  ]
}

标签: javascriptjsondiscord

解决方案


您遇到此问题的原因是因为require('./db.json')拉入 json 对象,分配一次,然后它永远不会改变。当您的代码运行时,它会更新文件一次(更改在线/总金额),然后您.find()将不再工作,因为database.members.find(z => z.id === "1").total正在查找旧数据。为什么不每次都写出json:

const Discord = require("discord.js");
const config = require("/config.json");
const client = new Discord.Client();
const fs = require('fs');

client.on("ready", () => {
    console.log(`
    CONNECTED!
    [${client.user.tag}]
    `)

    const updateUsers = () => {
        let onM = client.guilds.get(config.g).members.filter(member => member.user.presence.status !== "offline").size
        let totM = client.guilds.get(config.g).memberCount

        const json = {
            id: "1",
            online: onM,
            total: totM
        };

        const toWrite = JSON.stringify(json, null, 2);

        fs.writeFileSync('./db.json', toWrite);
    };

    setInterval(updateUsers, 3000);
    updateUsers();
});

client.login(config.token)

推荐阅读