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

通过Mojang与Hypixel API获取数据时的变量使用问题求助

解决动态对象属性访问与Promise作用域问题

首先,你遇到的两个核心问题:一是动态对象属性的语法错误,二是Promise链式调用中的变量作用域限制。咱们一步步来修正:

问题分析

  1. 动态属性访问错误:你尝试用jsonsb.profiles[0].members.${jsonsbid.id}这种写法访问对象属性,但JavaScript里不能在点语法中直接用模板字符串,必须用方括号语法[]来访问动态属性。
  2. 变量作用域问题:在Promise链式调用的第三个.then()里,你无法访问第一个.then()里的jsonsbid变量——因为每个.then()都是独立的函数作用域,变量不会自动传递下去。用async/await能完美解决这个问题,让代码逻辑更线性易懂。

修改后的完整代码

import { key } from './config.json';
import fetch from 'node-fetch'; // 把fetch移到顶部,避免重复加载

client.on('message', async message => { // 标记为async函数
  const prefix = '!skyblock ';
  if (!message.content.startsWith(prefix) || message.author.bot) return;

  const skyblockUsername = message.content.slice(prefix.length);

  try {
    // 第一步:通过Mojang API获取UUID
    const mojangResponse = await fetch(`https://api.mojang.com/users/profiles/minecraft/${skyblockUsername}`);
    const jsonsbid = await mojangResponse.json();
    
    if (!jsonsbid.id) {
      return message.channel.send('未找到该Minecraft用户,请检查用户名是否正确');
    }

    // 第二步:通过Hypixel API获取Skyblock数据
    const hypixelResponse = await fetch(`https://api.hypixel.net/Skyblock/profiles?uuid=${jsonsbid.id}&key=${key}`);
    const jsonsb = await hypixelResponse.json();

    // 检查返回数据是否有效
    if (!jsonsb.success || !jsonsb.profiles || jsonsb.profiles.length === 0) {
      return message.channel.send('该用户没有Skyblock档案,或API请求失败');
    }

    // 正确访问动态属性
    const targetMember = jsonsb.profiles[0].members[jsonsbid.id];
    if (!targetMember || !targetMember.coins_purse) {
      return message.channel.send('未找到该用户的钱包数据');
    }

    // 发送结果
    message.channel.send(`Coins: ${targetMember.coins_purse}`);
  } catch (err) {
    console.error(err); // 在控制台打印错误,方便调试
    message.channel.send('发生了一个错误,请稍后再试');
  }
});

关键改进点

  • 改用async/await:让异步代码看起来像同步代码,逻辑更清晰,也解决了变量作用域的问题,你可以在整个try块里访问jsonsbid变量。
  • 动态属性访问修复:用jsonsb.profiles[0].members[jsonsbid.id]替代错误的点语法+模板字符串写法。
  • 增加数据校验:在每一步都检查API返回的数据是否有效,避免因为用户不存在、没有Skyblock档案或API报错导致的程序崩溃,同时给用户更明确的提示。
  • 优化模块加载:把node-fetch的import移到顶部,不要在每次消息事件里重复require,这是更规范的写法。

新手编程建议

  • 学会打印调试:在关键步骤用console.log()打印API返回的JSON数据,比如console.log(jsonsb),这样你能清楚看到数据的结构,避免属性访问错误。
  • 理解Promise与async/await:async/await是Promise的语法糖,对新手更友好,建议优先学习这种写法。
  • 错误处理要细致:不要只捕获笼统的错误,要针对不同的失败场景(比如用户不存在、API返回错误)给出不同的提示,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:02:56