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
相关产品推荐
相关产品推荐

