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

Discord.js机器人转发私信到用户ID命名频道报send未定义错误如何解决

问题修复方案

Cannot read property "send" of undefined报错的核心原因是hsa变量为undefined,即guild.channels.cache.find方法没有匹配到名称和用户id一致的频道,此时调用send方法就会触发报错。

常见问题与修复方案

  • 移除find前多余的await
    guild.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 20:45:00