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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:10:34