Discord.js机器人转发私信到用户ID命名频道报send未定义错误如何解决
问题修复方案
Cannot read property "send" of undefined报错的核心原因是hsa变量为undefined,即guild.channels.cache.find方法没有匹配到名称和用户id一致的频道,此时调用send方法就会触发报错。
常见问题与修复方案
- 移除
find前多余的awaitguild.channels.cache是机器人本地缓存的服务器频道集合,find是同步方法,不需要加await,多余的await属于无用代码,不会影响匹配结果。 - 补充非空校验
要先校验服务器、频道是否获取成功,避免匹配不到对象时直接调用方法触发报错,也可以补充兜底逻辑处理频道不存在的场景。 - 检查基础配置
确认服务器中的频道名称完全等于用户id,没有多余空格、特殊符号,同时确认机器人拥有目标频道的访问权限、发消息权限。 - 版本适配
如果使用discord.js v14及以上版本,私信频道的类型判断需要改为message.channel.type === ChannelType.DM,需要先从discord.js包中引入ChannelType,否则私信消息不会触发对应逻辑。
修正后代码
// 若使用v14及以上版本,先引入ChannelType // const { ChannelType } = require('discord.js'); client.on("message", async (message) => { // v14及以上版本将下方的"dm"改为ChannelType.DM if (message.channel.type === "dm") { if (message.author.bot) return; const guild = client.guilds.cache.get("840120593311334410"); // 校验服务器是否获取成功 if (!guild) return; const targetChannelName = message.author.id; const targetChannel = guild.channels.cache.find((ch) => ch.name === targetChannelName); // 校验频道是否存在,可自定义兜底逻辑 if (!targetChannel) { message.reply("未找到你的专属频道,请联系管理员处理"); return; } // 发送用户的私信内容到对应频道 targetChannel.send(message.content); } });
如果还是匹配不到频道,可以在获取guild后添加以下打印代码,排查频道名称匹配问题:
console.log(guild.channels.cache.map(ch => ch.name));
内容的提问来源于stack exchange,提问作者yas
相关产品推荐
相关产品推荐

