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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:55:54