如何在Discord.JS中读取point.json并格式化输出内容?
实现思路与修正方案
这个功能完全可以实现!不过你当前的代码有几个关键问题需要调整,我来一步步帮你梳理和修正:
1. 处理fs.readFile的异步特性
fs.readFile是异步方法,直接赋值给points拿到的并不是解析好的JSON数据,而是一个Promise对象(如果用回调写法则是在回调函数里获取结果)。对于这种小配置文件,你可以用同步读取的fs.readFileSync更省心,也可以用async/await配合异步API来处理。
2. 必须解析JSON字符串
读取到的文件内容是纯字符串,必须用JSON.parse()转换成JavaScript对象后,才能访问里面的points属性。
3. 遍历所有数据生成目标格式
你想要的是把所有用户的名称: 分数格式拼接起来,而不是单独读取某个指定用户,所以不需要单独的target变量,直接遍历JSON对象的键值对即可。
修正后的完整代码示例
同步读取版本(适合小文件)
const fs = require('fs'); // 假设你已经定义了prefix、cmd变量,以及Discord的message对象 if(cmd === `${prefix}showwall`){ try { // 同步读取文件并解析JSON const pointsData = JSON.parse(fs.readFileSync('points.json', 'utf8')); // 遍历所有键值对,生成目标格式字符串 const displayText = Object.entries(pointsData) .map(([username, userData]) => `${username}: ${userData.points}`) .join(' '); // 发送最终结果 message.reply(displayText); } catch (err) { // 捕获文件读取或JSON解析错误,避免机器人崩溃 message.reply('读取数据时出现错误:' + err.message); } }
异步读取版本(适合大文件)
如果你更倾向于异步操作,可以用async/await写法:
const fs = require('fs').promises; // 注意:需要把命令处理的函数标记为async if(cmd === `${prefix}showwall`){ try { const fileContent = await fs.readFile('points.json', 'utf8'); const pointsData = JSON.parse(fileContent); const displayText = Object.entries(pointsData) .map(([username, userData]) => `${username}: ${userData.points}`) .join(' '); message.reply(displayText); } catch (err) { message.reply('读取数据时出现错误:' + err.message); } }
代码说明
Object.entries(pointsData):把JSON对象转换成键值对数组,比如[['name', {points:1}], ['anothername', {points:2}]],方便遍历处理。map():将每个键值对转换成"name: 1"这样的字符串。join(' '):把所有字符串用空格拼接,正好符合你想要的输出格式。try/catch:捕获文件不存在、JSON格式错误等异常,让机器人更健壮。
内容的提问来源于stack exchange,提问作者Dob
相关产品推荐
相关产品推荐

