javascript - discordjs setInterval 不更新 json 文件
问题描述
我想使用机器人在网站上显示不和谐公会的在线/总成员。
为了在网站上显示数据,我想我可以使用 jQuery 从 json 文件中提取 JSON 数据,所以我的朋友制作了一个托管在网站上的 JSON 数据库。在 json 文件中,机器人应该每 3 秒在字段中写入在线成员和总成员"online" "total"
。
问题是 JSON 数据不是每 3 秒更新一次。我尝试咨询 discord.js 文档,但没有帮助。请注意,我不知道 javascript,因此我很难找到编写代码的解决方案。
这是机器人的代码:index.js 代码 这是config.json和db.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
}
]
}
解决方案
您遇到此问题的原因是因为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)
推荐阅读
- azure - 支持从 Azure 到 QRadar 的事件
- javascript - Webpack5 在运行时无法编译图像并引发错误
- javascript - 如何将文本从前 50 个单词缩短并将其放回细节函数 Javascript?
- jquery - 当超过 10k 数据时,Laravel 数据表加载缓慢
- php - 合并 2 个 json 文件,其中并非所有数据都匹配
- pine-script - 如何在 PineScript 中获取蜡烛的百分比变化数据?
- android - 我的 android studio 中很少有 xml 文件显示一些奇怪的文本
- javascript - 反应强制在按钮单击时完全重新渲染
- zeebe - 如何在 1.1.0 稳定版的 zeebe 客户端中完成“USER_TASK”?
- mongodb - 连接完成后如何创建一个简单的检索 API?