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

NodeJS遍历JSON文件及Discord机器人会员验证与实时加载问题

解决你的Discord机器人两个问题:ID判断失效与JSON实时加载

我来帮你搞定这两个棘手的问题,咱们一步步拆解:

一、会员ID判断逻辑失效的问题

先看你的代码里的判断条件:if (uID === ftpr.buyers[i]),这里犯了一个小错误——你的buyers.json里的buyers数组每个元素都是包含id属性的对象,比如{ "id": "331499609509724162" },而uID是字符串类型的用户ID。直接把字符串和对象做全等比较,结果肯定是false,这就是循环判断失效的原因。

修改后的代码片段:

case "spotify": 
var uID = message.author.id; 
// 遍历buyers数组,每个元素是带id的对象
for (let i = 0; i < fptr.buyers.length; i++) { 
  // 这里要取对象的id属性来比较
  if (uID === fptr.buyers[i].id) { 
    var _embed = new Discord.RichEmbed() 
      .setTitle("Spotify") 
      .addField("Username", "testsda@yahoo.com") 
      .addField("Password", "ithastobe8") 
      .setColor(0x00FFFF) 
      .setFooter("Sincerely, LajgaardMoneyService") 
      .setThumbnail(message.author.avatarURL); 
    message.author.send(_embed); 
    console.log(message.author + " Just used the command !spotify")
    // 找到匹配的ID后可以跳出循环,避免不必要的遍历
    break;
  } 
} 
break;

另外补充个小优化:找到匹配的ID后用break跳出循环,不用继续遍历剩下的元素,提升一点效率。

二、实时加载更新后的JSON文件问题

Node.js的require函数会对加载的模块进行缓存,也就是说第一次导入buyers.json后,后续再调用require("./buyers.json")会直接返回缓存的内容,不会重新读取文件,所以修改JSON文件后必须重启应用才能生效。

要实现实时加载,有两种常用方案:

方案1:每次需要时用fs模块读取并解析文件

直接绕过require的缓存,每次调用指令时读取最新的文件内容:

const fs = require('fs');
const path = require('path');

// 封装一个函数,每次调用都读取最新的buyers数据
function getBuyers() {
  const filePath = path.join(__dirname, 'buyers.json');
  // 同步读取文件(因为指令处理是同步场景,用同步更方便)
  const fileContent = fs.readFileSync(filePath, 'utf8');
  return JSON.parse(fileContent);
}

// 在指令里使用
case "spotify": 
var uID = message.author.id; 
const fptr = getBuyers(); // 每次都获取最新数据
for (let i = 0; i < fptr.buyers.length; i++) { 
  if (uID === fptr.buyers[i].id) { 
    // ... 你的embed代码 ...
    message.author.send(_embed); 
    console.log(message.author + " Just used the command !spotify")
    break;
  } 
} 
break;

方案2:清除require缓存后重新加载

如果你还是想用require,可以在每次需要前清除对应模块的缓存:

function getBuyers() {
  // 清除buyers.json的缓存
  delete require.cache[require.resolve('./buyers.json')];
  // 重新require,此时会读取最新文件
  return require('./buyers.json');
}

// 指令里同样调用getBuyers()获取最新数据
case "spotify": 
var uID = message.author.id; 
const fptr = getBuyers();
// ... 后续判断逻辑 ...
break;

两种方案都能实现实时加载,方案1更直接,方案2适合习惯用require的场景,你可以根据自己的需求选择。

内容的提问来源于stack exchange,提问作者Oscar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:28