如何解决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
相关产品推荐
相关产品推荐

