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

如何在换行符处切割Discord.js中超过2000字符的消息

解决Discord长消息换行处切割问题

你需要重写消息切割函数,让它在接近指定长度时优先找最近的换行符(\n)来分割,这样就能保留原有的文本格式。

修改后的切割函数

function splitMessage(str, maxSize) {
    const chunks = [];
    let currentIndex = 0;

    while (currentIndex < str.length) {
        // 计算当前截取的结束位置,最多到maxSize
        let endIndex = Math.min(currentIndex + maxSize, str.length);
        
        // 如果还没到字符串末尾,找最近的换行符
        if (endIndex < str.length) {
            // 从endIndex往前找最后一个换行符
            endIndex = str.lastIndexOf('\n', endIndex);
            
            // 如果找不到换行符(比如一段超长无换行的文本),就直接按maxSize截断
            if (endIndex === -1) {
                endIndex = currentIndex + maxSize;
            }
        }
        
        // 截取当前片段并加入数组
        chunks.push(str.substring(currentIndex, endIndex));
        // 更新起始位置,跳过换行符本身
        currentIndex = endIndex + 1;
    }

    return chunks;
}

函数逻辑说明

  • 循环处理整个字符串,每次从当前位置开始计算最大截取长度
  • 优先在maxSize范围内找最后一个换行符,确保切割位置在段落末尾
  • 若遇到无换行的超长文本(极端情况),依然会按maxSize截断,避免程序卡住
  • 每次切割后跳过换行符,避免片段开头出现空行

结合你的代码使用

  1. 替换你原来的splitMessage函数
  2. 调用时保持1900的长度限制(给Discord的格式标记留余量,避免实际发送时超过2000字符)
  3. 删除代码里未使用的splitted变量

修改后的发送部分代码:

const channelMessageString = header + playersString + footer + lastUpdated;
const messageChunks = splitMessage(channelMessageString, 1900);
for (const chunk of messageChunks) {
  await client.channels.cache.get(listChannel).send(chunk);
}

这样切割出来的消息都会在换行处分割,不会破坏你原本的列表格式和排版了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:35