如何在JS/Discord.js中使用变量从JSON文件获取数据?
嘿,这个需求我太熟了!之前做Discord机器人存用户数据的时候,经常要用到变量来动态访问JSON里的内容,完全有可行的办法~
核心思路:用方括号语法替代点语法
你平时用的jsonFile.path是点语法,它只能跟着固定的属性名字面量。如果想用变量的值作为属性名/路径,只需要换成方括号语法jsonFile[yourVariable]就行——这是JavaScript访问对象属性的标准方式,完全适配你的场景。
结合你的场景的完整示例
假设你的JSON文件结构是这样的(用对象存随机数,方便快速查找):
{ "123": { "userId": "123456789", "timestamp": "2024-05-20T12:34:56.789Z" }, "456": { "userId": "987654321", "timestamp": "2024-05-20T13:45:01.234Z" } }
下面是对应Discord机器人命令的完整代码逻辑(适配Discord.js v14+的异步风格):
const { SlashCommandBuilder } = require('discord.js'); const fs = require('fs').promises; const path = require('path'); module.exports = { data: new SlashCommandBuilder() .setName('randomnum') .setDescription('生成并保存一个唯一随机数'), async execute(interaction) { // 1. 读取JSON文件并解析为JavaScript对象 const jsonFilePath = path.join(__dirname, 'randomNumbers.json'); const rawJson = await fs.readFile(jsonFilePath, 'utf8'); let randomNumData = JSON.parse(rawJson); // 2. 生成随机数(这里设为0-999的范围,你可以自己调整) let randomNum = Math.floor(Math.random() * 1000); // 3. 检查随机数是否已存在,存在就重新生成(避免重复) while (randomNumData[randomNum]) { randomNum = Math.floor(Math.random() * 1000); } // 4. 将新随机数添加到对象中 randomNumData[randomNum] = { userId: interaction.user.id, timestamp: new Date().toISOString() }; // 5. 将修改后的对象写回JSON文件 await fs.writeFile(jsonFilePath, JSON.stringify(randomNumData, null, 2), 'utf8'); // 回复用户 await interaction.reply(`✅ 生成的唯一随机数是:**${randomNum}**,已保存到记录中!`); }, };
额外注意事项
- 如果你的JSON是数组结构(比如
[123,456,789]),检查存在的方式是randomNumData.includes(randomNum),添加用randomNumData.push(randomNum),但数组的查找效率比对象低,数据量大的时候更推荐用对象。 - 如果是嵌套的JSON结构(比如
jsonFile.users[userId].randomNums),同样可以用方括号嵌套:jsonFile.users[targetUserId].randomNums[randomNum]。 - 读写JSON文件时一定要用异步方法(比如
fs.promises),避免阻塞Discord机器人的事件循环。
内容的提问来源于stack exchange,提问作者NintendoZaedus
相关产品推荐
相关产品推荐

