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

如何解决Discord机器人Promise问题及Invalid Form Body错误

解决Discord.js中"Invalid Form Body: user_id是undefined"错误及异步函数问题

核心问题分析

从报错信息和代码来看,有两个关键问题:

  • args[0]未定义:你传给members.fetch()的用户ID是undefined,Discord API要求必须传入有效的snowflake(数字格式的用户/服务器ID),所以触发了50035错误。
  • 异步函数调用未加await:mbr()是异步函数,直接赋值let member = mbr()得到的是一个Promise对象,不是实际的GuildMember实例,后续访问member.roles会直接出错。

分步解决

1. 校验输入参数的有效性

在调用members.fetch()之前,先确认args[0]存在且是有效的snowflake格式:

  • 检查args数组是否有元素,避免args[0]为undefined
  • 可以简单用正则校验snowflake(Discord的ID都是17-20位数字字符串)

2. 正确处理异步函数

调用异步函数必须使用await,且调用上下文必须是async函数。

修正后的代码示例

// 把代码放在async函数中,确保可以使用await
async function checkMemberRole() {
  // 先校验输入参数
  if (!args[0] || !/^\d{17,20}$/.test(args[0])) {
    console.log("请传入有效的用户ID");
    return;
  }

  try {
    // 直接简化异步逻辑,不需要多余的then
    const member = await client.guilds.cache.get("1037783624449282189").members.fetch(args[0]);
    
    // 检查角色是否存在
    if (member.roles.cache.has("1039983830389510305")) {
      console.log("该用户拥有目标角色");
      // 这里写后续逻辑
    } else {
      console.log("该用户没有目标角色");
    }
  } catch (error) {
    // 捕获API错误,比如用户不存在、无权限等
    console.error("获取成员失败:", error);
  }
}

// 调用函数
checkMemberRole();

额外说明

  • 避免在async函数中混用await和then,保持代码风格一致,await已经可以直接获取异步结果,不需要额外的then回调。
  • 加上try/catch可以处理各种异常情况,比如服务器不存在、bot没有获取成员的权限、用户不在服务器中等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:55:18