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

Discord.js异步try-catch语句失效导致机器人崩溃求助

问题分析与解决方案

核心问题点

  1. 异步错误未被完全捕获:原代码里client.channels.cache.get(...).send()是异步操作,但没加await,导致这个操作的错误脱离try-catch范围,引发崩溃且无日志输出。
  2. 特殊字符处理缺失:Discord引用符号(> )这类特殊字符可能导致chat.chat()接口无法正常解析,或是containsLetters函数误判消息为空,触发后续逻辑异常。

修复步骤

1. 完善异步错误捕获

给send操作加上await,确保所有异步错误都能被try-catch捕获,同时添加控制台日志便于排查:

client.on("message", async message => {
    if(message.channel.id === "1006483461747527772" && !message.author.bot){
        // 先检查消息非空,避免空消息触发逻辑
        if(message.content.trim().length > 0 && containsLetters(message.content)) {
            try{
                let reply = await chat.chat(message.content)
                // 对send操作加await,确保错误被捕获
                await message.channel.send(reply)
            } catch(err){
                console.error("机器人运行错误:", err)
                await message.channel.send(`发生错误: ${err.message || err}`)
            }  
        }
    } 
})

2. 预处理特殊字符

在传入聊天接口前清理Discord引用符号等特殊内容,避免解析异常:

// 清理消息内容:移除Discord引用行、多余空格
function cleanMessage(content) {
    // 移除所有以> 开头的引用行
    content = content.replace(/^> .*$/gm, '')
    // 移除多余空白字符
    return content.trim()
}

// 在调用chat.chat前使用清理函数
let cleanedContent = cleanMessage(message.content)
if(cleanedContent.length > 0 && containsLetters(cleanedContent)) {
    let reply = await chat.chat(cleanedContent)
    await message.channel.send(reply)
}

3. 优化containsLetters判断逻辑

如果原函数仅检测纯字母,会误判带特殊字符但含有效文本的消息,修改为:

function containsLetters(str) {
    // 匹配任意大小写字母,确保含有效文本的消息不被过滤
    return /[a-zA-Z]/.test(str)
}

额外建议

  • 给客户端添加错误监听,排查未知问题:
    client.on('error', console.error)
    client.on('warn', console.warn)
    
  • 用message.channel.send()替代client.channels.cache.get(...).send(),代码更简洁且避免频道缓存失效问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:06:24