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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:40:11