使用Shards编辑指定频道消息报错:message.edit不是函数
问题原因
你遇到的问题是因为broadcastEval执行后返回的是序列化后的普通JavaScript对象,而非Discord.js原生的Message实例。序列化过程会丢失类的方法(比如edit),所以你拿到的message对象只有数据属性,没有可调用的方法。
解决方案
有两种可行的处理方式:
方式一:直接在分片内完成编辑操作
不用返回消息对象,而是在找到消息的分片里直接执行编辑逻辑,这样能避免序列化问题:
async function editMessage(channelId, messageId, content, client) { // 在所有分片执行,找到目标消息的分片后编辑 const results = await client.shard.broadcastEval(async (c, params) => { const { channelId, messageId, content } = params; const channel = await c.channels.fetch(channelId); if (!channel) return null; const message = await channel.messages.fetch(messageId); if (!message) return null; await message.edit({ content }); return true; // 编辑成功标记 }, { context: { channelId, messageId, content } }); // 返回是否编辑成功 return results.some(res => res === true); } // 调用示例 const editSuccess = await editMessage( '1114550429917925416', '1118615356701937746', 'test', client ); console.log(editSuccess ? '编辑成功' : '未找到目标消息');
方式二:先定位分片,再单独在目标分片执行编辑
如果需要先获取消息信息再编辑,可以让分片返回自身ID,之后仅在目标分片执行编辑操作:
async function getMessageShardInfo(channelId, messageId, client) { const results = await client.shard.broadcastEval(async (c, params) => { const { channelId, messageId } = params; const channel = await c.channels.fetch(channelId); if (!channel) return null; const message = await channel.messages.fetch(messageId); if (!message) return null; // 返回分片ID和消息关键信息 return { shardId: c.shard.ids[0], channelId, messageId }; }, { context: { channelId, messageId } }); return results.find(info => info !== null); } // 调用示例 const messageShardInfo = await getMessageShardInfo( '1114550429917925416', '1118615356701937746', client ); if (messageShardInfo) { await client.shard.broadcastEval(async (c, params) => { const { shardId, channelId, messageId, content } = params; // 只在目标分片执行 if (c.shard.ids[0] !== shardId) return; const channel = await c.channels.fetch(channelId); const message = await channel.messages.fetch(messageId); await message.edit({ content }); }, { context: { ...messageShardInfo, content: 'test' } }); }
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

