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

discord.js技术问题:添加用户名到字符串时出现异常

解决Discord.js中从ID列表获取用户名并拼接回复的问题

看起来你卡在异步操作的处理上了——fetchUser(或者v12+版本里的users.fetch)是异步函数,直接在forEach里调用的话,你的msg字符串会在所有用户数据获取完成前就被构建好了,自然拿不到正确的用户名。下面是具体的解决方案:

核心问题分析

forEach不会等待异步任务完成,当你遍历config.privileged时,每个用户获取请求都是异步发起的,但代码会直接继续执行后续逻辑,导致msg里根本没来得及填充用户名。我们需要用Promise.all配合async/await来等待所有用户数据获取完成后再拼接消息。

完整代码示例(适配Discord.js v12+)

if (command === "privlist") {
  try {
    // 把每个ID的用户获取任务包装成Promise
    const userEntries = await Promise.all(
      config.privileged.map(async (userId, index) => {
        try {
          // 从API获取用户信息(即使不在缓存中也能拿到)
          const user = await client.users.fetch(userId);
          // 返回格式化的行:索引: 用户名#标签
          return `${index}: ${user.tag}`;
          // 如果只需要纯用户名,换成user.username即可
        } catch (err) {
          // 处理无效ID或无法获取用户的情况
          return `${index}: 无效用户ID (${userId})`;
        }
      })
    );

    // 拼接最终消息
    const msg = `[Privileged Users]\n${userEntries.join("\n")}`;
    // 发送消息到当前频道
    await message.channel.send(msg);
  } catch (globalErr) {
    // 捕获全局错误,比如config.privileged不是数组的情况
    await message.channel.send("获取特权用户列表时出错,请检查配置文件。");
    console.error("Privlist command error:", globalErr);
  }
}

适配Discord.js v11及更早版本

如果你的机器人用的是v11版本,只需要把client.users.fetch(userId)替换成client.fetchUser(userId)即可,其他逻辑完全一致。

额外注意事项

  • 确保config.privileged是字符串类型的用户ID数组(Discord用户ID本质是字符串,不要用数字类型,避免精度丢失)。
  • 如果机器人无法获取某个用户(比如用户不在共享服务器,且机器人没有相关权限),代码会自动标记为“无效用户ID”,避免整个命令崩溃。
  • 用async/await时,要确保外层命令处理函数是async的——如果原本不是,需要改成async function(...)或者用.then()链式调用替代await。

内容的提问来源于stack exchange,提问作者Merlin W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:55:08