You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:10