Discord.js机器人消息发送异常:内容变代码、数字转字符串
Discord.js长消息发送问题解决指南
问题描述
用Discord.js开发机器人时,调用message.channel.send发送长消息触发了Discord的2000字符限制;拆分消息后又出现新问题:消息被误识别为代码块,数字被转成字符串格式。原代码(已翻译为中文)如下:
if (message.content === "rules") { message.channel.send (`**大家好, 欢迎加入Eagle工作室,这里能满足你自由职业阶段的所有需求 我们拥有经验丰富的卖家、代练和程序员…… 我们提供哪些服务呢? 1. 覆盖全领域的程序员服务 2. 图片设计与平面设计服务 3. 游戏代练与等级提升(含小号服务),详情可查看#prices频道 4. 为代发货商及初创网站、店铺等提供营销服务 5. 为自由职业者提供项目资源(收取少量费用) 6. 兼职岗位推荐 =========================================================================================================== 首先,你必须遵守以下服务器规则: 1. 互相尊重 2. 禁止刷屏 3. 使用恰当的语言和内容 4. 禁止人身攻击或人肉搜索 5. 遵守Discord服务条款 6. 尊重服务器工作人员,无理由请勿@他们 7. 禁止未经授权的广告 8. 禁止NSFW内容,违者立即封禁 9. 禁止发送Discord服务器邀请链接 10. 求职申请中禁止恶意捣乱 =========================================================================================================== 接下来是店铺规则: 1. 购买前务必联系服务器中介确认(免费服务) 2. 我们的服务大多由自由职业者提供,若你在交易或价格上与他们产生纠纷,请联系工作人员协调解决 3. 你可以通过创建工单或使用我们在g2g等平台的可信销售页面购买/咨询服务,输入m.links可获取平台链接 4. 确认服务前请务必考虑清楚,我们不提供退款服务 ============================================================================================================ 以上是服务器通用规则。 各频道的专属规则请查看对应频道说明。 若需要帮助,请创建工单,我们会尽快响应。 祝大家玩得开心!**`) };
问题原因
- 原消息长度远超Discord单条消息2000字符的限制,直接发送会失败
- 拆分消息时若破坏了Markdown语法结构(比如在加粗标签
**中间拆分、或拆分位置导致Discord误判格式),就会出现代码块识别、格式异常的问题
解决方案
方案1:手动拆分消息(格式可控,推荐)
根据原消息的自然分隔点(比如分割线),将长消息拆分为多个长度不超过2000字符的完整片段,确保每个片段的Markdown语法完整:
if (message.content === "rules") { // 拆分后的消息片段,每个片段独立且语法完整 const msgParts = [ `**大家好, 欢迎加入Eagle工作室,这里能满足你自由职业阶段的所有需求 我们拥有经验丰富的卖家、代练和程序员…… 我们提供哪些服务呢? 1. 覆盖全领域的程序员服务 2. 图片设计与平面设计服务 3. 游戏代练与等级提升(含小号服务),详情可查看#prices频道 4. 为代发货商及初创网站、店铺等提供营销服务 5. 为自由职业者提供项目资源(收取少量费用) 6. 兼职岗位推荐**`, `**=========================================================================================================== 首先,你必须遵守以下服务器规则: 1. 互相尊重 2. 禁止刷屏 3. 使用恰当的语言和内容 4. 禁止人身攻击或人肉搜索 5. 遵守Discord服务条款 6. 尊重服务器工作人员,无理由请勿@他们 7. 禁止未经授权的广告 8. 禁止NSFW内容,违者立即封禁 9. 禁止发送Discord服务器邀请链接 10. 求职申请中禁止恶意捣乱**`, `**=========================================================================================================== 接下来是店铺规则: 1. 购买前务必联系服务器中介确认(免费服务) 2. 我们的服务大多由自由职业者提供,若你在交易或价格上与他们产生纠纷,请联系工作人员协调解决 3. 你可以通过创建工单或使用我们在g2g等平台的可信销售页面购买/咨询服务,输入m.links可获取平台链接 4. 确认服务前请务必考虑清楚,我们不提供退款服务**`, `**============================================================================================================ 以上是服务器通用规则。 各频道的专属规则请查看对应频道说明。 若需要帮助,请创建工单,我们会尽快响应。 祝大家玩得开心!**` ]; // 依次发送每个片段,添加短暂延迟避免触发速率限制 for (const part of msgParts) { await message.channel.send(part); await new Promise(resolve => setTimeout(resolve, 500)); } };
方案2:自动拆分通用函数(适合动态生成的内容)
如果消息内容是动态生成的,可使用通用拆分函数,按2000字符拆分的同时优先保证段落完整,避免破坏Markdown语法:
// 通用长消息拆分函数 function splitLongMessage(content, maxLength = 2000) { const parts = []; let currentPart = ''; // 按空行分割段落,优先保证段落完整性 const paragraphs = content.split('\n\n'); for (const para of paragraphs) { // 若当前段落加入后超过限制,先保存当前片段 if (currentPart.length + para.length + 2 > maxLength) { parts.push(currentPart.trim()); currentPart = para; } else { // 否则将段落加入当前片段 currentPart += (currentPart ? '\n\n' : '') + para; } } // 加入最后一段未保存的内容 if (currentPart) parts.push(currentPart.trim()); return parts; } // 使用示例 if (message.content === "rules") { const fullMessage = `**大家好, 欢迎加入Eagle工作室,这里能满足你自由职业阶段的所有需求 我们拥有经验丰富的卖家、代练和程序员…… 我们提供哪些服务呢? 1. 覆盖全领域的程序员服务 2. 图片设计与平面设计服务 3. 游戏代练与等级提升(含小号服务),详情可查看#prices频道 4. 为代发货商及初创网站、店铺等提供营销服务 5. 为自由职业者提供项目资源(收取少量费用) 6. 兼职岗位推荐 =========================================================================================================== 首先,你必须遵守以下服务器规则: 1. 互相尊重 2. 禁止刷屏 3. 使用恰当的语言和内容 4. 禁止人身攻击或人肉搜索 5. 遵守Discord服务条款 6. 尊重服务器工作人员,无理由请勿@他们 7. 禁止未经授权的广告 8. 禁止NSFW内容,违者立即封禁 9. 禁止发送Discord服务器邀请链接 10. 求职申请中禁止恶意捣乱 =========================================================================================================== 接下来是店铺规则: 1. 购买前务必联系服务器中介确认(免费服务) 2. 我们的服务大多由自由职业者提供,若你在交易或价格上与他们产生纠纷,请联系工作人员协调解决 3. 你可以通过创建工单或使用我们在g2g等平台的可信销售页面购买/咨询服务,输入m.links可获取平台链接 4. 确认服务前请务必考虑清楚,我们不提供退款服务 ============================================================================================================ 以上是服务器通用规则。 各频道的专属规则请查看对应频道说明。 若需要帮助,请创建工单,我们会尽快响应。 祝大家玩得开心!**`; const messageParts = splitLongMessage(fullMessage); // 依次发送拆分后的片段 for (const part of messageParts) { await message.channel.send(part); await new Promise(resolve => setTimeout(resolve, 500)); } };
注意事项
- 拆分时尽量在段落、分割线等自然位置拆分,避免打断Markdown语法(比如不要在
**标签中间拆分) - 添加500ms左右的延迟,避免触发Discord的消息发送速率限制
- 确保每个拆分后的片段Markdown语法完整,比如加粗标签要配对
内容的提问来源于stack exchange,提问作者Punisher_Ku
相关产品推荐
相关产品推荐

