如何将使用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
相关产品推荐
相关产品推荐

