Discord.js中函数返回undefined问题求助
问题分析与修复
你的代码核心问题是pingSubbed()函数没有返回值——虽然你在函数里调用了ping.roleID.call(John)获取到了正确的role值,但没有把这个值return出去,所以函数默认返回undefined,最终拼接消息时就出现了@undefined。
另外,用多个if判断用户名的写法不够简洁,可以用对象映射来优化代码结构。
修复后的简洁版代码
// 用对象直接映射用户名和对应的role,比多个if更易维护 const userRoles = { John: "abc", Mary: "123" }; function pingSubbed() { const username = message.author.username; // 从映射对象取对应role,不存在则返回空字符串避免多余@ return userRoles[username] || ""; } // 拼接消息时直接使用返回的role值 yield hook.send(`**${message.author.username}**\n ${messageContents} @${pingSubbed()}`);
保留原写法的修复版本
如果你想保留原来的ping对象结构,只需给pingSubbed添加返回语句:
const ping = { roleID: function() { return this.role; } }; const John = { role: "abc" }; const Mary = { role: "123" }; function pingSubbed() { let pingID = message.author.username; if (pingID == "John") { // 把调用结果return出去 return ping.roleID.call(John); } if (pingID == "Mary") { return ping.roleID.call(Mary); } // 处理用户名不在列表的情况,返回空字符串 return ""; } yield hook.send(`**${message.author.username}**\n ${messageContents} @${pingSubbed()}`);
关键改动说明
- 给
pingSubbed函数添加return语句,将获取到的role值返回给调用者 - 优化用户-role映射逻辑(可选),让代码更简洁易扩展
- 处理了用户名不在列表中的边界情况,避免出现多余的
@符号
内容的提问来源于stack exchange,提问作者Danny P
相关产品推荐
相关产品推荐

