如何在discord.js中使用message fetch获取频道消息嵌入embed发送,报错如何解决
discord.js 调用channel.messages.fetch报错解决方案
这个错误本质是你获取到的channel对象不存在messages属性,导致访问messages.fetch时抛出空指针异常,常见原因及解决方法如下:
- 未开启对应网关意图
discord.js v13及以上版本强制要求开启消息相关网关权限才能访问频道消息数据:
- 进入Discord开发者后台的对应机器人设置页,开启
Message Content Intent开关 - 初始化Client实例时传入对应意图,示例代码:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 必选,服务器基础权限 GatewayIntentBits.GuildMessages, // 服务器消息权限 GatewayIntentBits.MessageContent // 消息内容读取权限 ] });
- 获取的频道对象类型错误
如果获取到的是分类频道、语音频道等非文本类频道,本身就不具备messages属性:
调用接口前先校验频道类型,示例代码:
const targetChannel = client.channels.cache.get('你的目标频道ID'); // 校验是否为可发送消息的文本类频道 if (!targetChannel?.isTextBased()) { console.log('目标频道不是有效文本频道'); return; }
- 操作时机错误
不要在客户端登录完成前调用频道相关接口,所有逻辑需要在客户端ready事件触发后执行,完整功能示例代码如下:
const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] }); client.on('ready', async () => { console.log(`登录成功,身份:${client.user.tag}`); // 替换为你的目标频道ID const targetChannel = client.channels.cache.get('替换为频道ID'); if (!targetChannel?.isTextBased()) return; // 获取最新1条消息 const messages = await targetChannel.messages.fetch({ limit: 1 }); const latestMsg = messages.first(); // 构建Embed const msgEmbed = new EmbedBuilder() .setTitle('最新消息内容') .setDescription(latestMsg.content) .setAuthor({ name: latestMsg.author.tag, iconURL: latestMsg.author.displayAvatarURL() }) .setTimestamp(latestMsg.createdTimestamp); // 发送回原频道 await targetChannel.send({ embeds: [msgEmbed] }); }); // 替换为你的机器人Token client.login('你的机器人Token');
内容的提问来源于stack exchange,提问作者Kamo005
相关产品推荐
相关产品推荐

