使用fs.writeFile写入JSON时,键名未替换为变量值的问题求助
解决Discord.js中fs.writeFile生成JSON时键名未取变量值的问题
你遇到的问题是JavaScript对象字面量的一个常见细节:当你直接在对象里写TargetMemberID: { ... }时,JavaScript会把TargetMemberID当作字符串键名,而不是读取变量TargetMemberID的值。要让键名使用变量的内容,你需要用计算属性名(用方括号包裹变量)。
错误原因分析
你之前尝试的data[message.guild.id[TargetMember.id]]写法完全偏离了正确思路——这相当于把message.guild.id当作数组,去取索引为TargetMember.id的值,显然不符合你的需求。正确的逻辑应该是:先定位到data[message.guild.id]这个对象,然后给它添加一个以TargetMemberID变量值为键的属性。
修正后的代码
把你赋值的那行代码改成下面这样:
const TargetMemberID = TargetMember.id; // 使用计算属性名 [TargetMemberID] 来将变量值作为键名 data[message.guild.id] = { [TargetMemberID]: { Moderation: 'Kick', Target: `${TargetMember.user.tag}`, Moderator: `${message.author.tag}`, Reason: `${Reason}`, ID: `#${ID}` } }; fs.writeFile("./data.json", JSON.stringify(data, null, 2), (err) => { if (err) console.log(err); });
我还在JSON.stringify里加了null, 2参数,这样生成的JSON会格式化缩进,方便后期查看和调试。
验证效果
修改后,生成的JSON就会和你期望的结构完全一致:
{"726623241984278589": {"322366672625467392": {"Moderation": "Kick", "Target": "Bobo#1601", "Moderator": "Bobosky#3914", "Reason": "Testing", "ID": "#XLR6RV8M"}}}
其实这个小技巧是ES6引入的特性,专门用来解决“用变量作为对象键名”的场景,记住它以后就能轻松避开这类坑啦~
内容的提问来源于stack exchange,提问作者Bobosky
相关产品推荐
相关产品推荐

