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

如何将使用forEach的Util.splitMessage升级适配Discord.js V13?

Discord.js V13 分页消息脚本升级方案

问题背景

  • 目标是将Discord.js V12环境下正常运行的玩家列表分页消息脚本升级至V13版本
  • 升级过程中遇到Discord.Util.splitMessage执行报错、V13语法适配问题
  • 已知Util.splitMessage会在后续版本中被移除,需要兼容V13的可运行实现

原有V12可运行代码

let chunks = Discord.Util.splitMessage(data);
let embed = new Discord.MessageEmbed().setTitle(`all_players`);

if (chunks.length > 1) {
    chunks.forEach((chunk, i) => 
       message.channel.send(
         embed
        .setDescription(chunk)
        .setFooter(`Part ${i + 1} / ${chunks.length}`),
        ),
    );
      console.log('Completed !all in message');
} else {
      msg.channel.send(embed.setDescription(result.length > 0 ? result : 'No Players'));
      console.log('Completed !all No Players');
};

预期分页效果

1....
2....
3....
99....
100....
Part 1/2

101....
102....
103....
199....
200....
Part 2/2

初始升级的错误V13代码

let chunks = Discord.Util.splitMessage(data);

  if (chunks.length > 1) {
  let embed = new Discord.MessageEmbed();
     chunks.map((chunk, i) => {
        embed.setTitle(`all_players}`)
             .setDescription(chunk)
             .setFooter(`Part ${i + 1} / ${chunks.length}`)
        message.channel.send({ embeds: [embed] })
      });
   }

运行报错信息

Error: Expected a string

问题根因

  • 核心报错原因:splitMessage方法仅接收字符串类型入参,传入的data为数组类型,不符合参数要求直接触发类型错误,将数组通过join("\n")转换为字符串即可解决该问题
  • 语法适配问题:V13版本中发送嵌入消息的格式变更,需将embed实例放入embeds数组中传入send方法
  • 代码笔误:错误版本中setTitle(all_players})多写了一个多余的右花括号,会导致标题显示异常
  • 循环逻辑:V13完全兼容V12的forEach循环写法,无需强行替换为map方法

修复后可运行的V13代码

// 将数组类型的data用换行符拼接为字符串,再传入splitMessage做分页切割
let chunks = Discord.Util.splitMessage(data.join("\n"));

if (chunks.length > 1) {
    // 沿用forEach循环逻辑,和V12使用习惯一致
    chunks.forEach((chunk, i) => {
        // 每次循环新建embed实例,避免对象引用导致所有分页内容和最后一页一致
        const pageEmbed = new Discord.MessageEmbed()
            .setTitle(`all_players`)
            .setDescription(chunk)
            .setFooter(`Part ${i + 1} / ${chunks.length}`);
        // V13要求embed包裹在embeds数组中发送
        message.channel.send({ embeds: [pageEmbed] });
    })
    console.log('Completed !all in message');
} else {
    const emptyEmbed = new Discord.MessageEmbed()
        .setTitle(`all_players`)
        .setDescription(result.length > 0 ? result.join("\n") : 'No Players');
    message.channel.send({ embeds: [emptyEmbed] });
    console.log('Completed !all No Players');
}

补充说明

  • data.join()建议传入\n作为分隔符,保证每条玩家数据单独占一行,和V12展示效果一致
  • 若后续版本移除Util.splitMessage,可自行实现按2048字符(Embed描述字段长度上限)切割字符串的逻辑,无需依赖内置工具方法
  • 不要在循环外部声明单个embed实例反复修改属性,JavaScript对象引用特性会导致异步发送时所有消息内容被最后一次修改覆盖

内容的提问来源于stack exchange,提问作者kuju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:18:27