如何解决Node.js中discord.js报错"Message content must be a non-empty string"
错误根因
报错触发自代码第46行的msg.channel.send(chatData.join("\n"))语句:当你执行.chat指令后,750毫秒内Minecraft服务端没有返回任何聊天内容的情况下,chatData会是空数组,执行join("\n")后得到的是空字符串,而你使用的discord.js版本禁止发送内容为空的消息,因此抛出RangeError [MESSAGE_CONTENT_TYPE]错误。
修复方法
你可以任选以下任意一种方案修改代码:
- 方案1:发送前先校验消息内容非空,空内容选择跳过发送或者返回默认提示
将原代码中的setTimeout回调部分替换为:
setTimeout(() => { sending = false if (chatData.length) { msg.channel.send(chatData.join("\n")) } else { // 不需要提示的话可以直接删掉这行,不做任何操作即可 msg.channel.send("*指定时间内未收到游戏内返回消息*") } chatData = [] }, 750)
- 方案2:给发送内容增加兜底值,避免出现空字符串
setTimeout(() => { sending = false // 空数组join后为假值,会自动使用后面的兜底内容 msg.channel.send(chatData.join("\n") || "*无游戏内消息返回*") chatData = [] }, 750)
可选优化建议
你当前的逻辑仅在用户发送.chat指令后的750毫秒内收集游戏消息,容易漏发游戏内的主动推送消息。如果需要实现完整的双向消息同步,可以去掉sending状态限制,只要收到Minecraft侧的消息就直接转发到Discord指定频道:
// 替换原有的bot.on("message")监听逻辑 bot.on("message", message => { const formattedMsg = `${message}`.trim() if (formattedMsg) { // 替换为你需要转发的Discord频道ID const targetChannel = client.channels.cache.get("替换为你的频道ID") targetChannel?.send(formattedMsg) } })
内容的提问来源于stack exchange,提问作者StilShem
相关产品推荐
相关产品推荐

