【问题标题】:Mongoose error: "Topology was destroyed", what's the problem?Mongoose 错误:“拓扑被破坏”,有什么问题?
【发布时间】:2021-09-23 13:32:03
【问题描述】:

我正在为我的 discord 机器人编写一个调平系统,但在途中遇到了一个 mongoerror,有谁知道为什么会发生这种情况? (每当有人聊天时,addXp 函数就会运行,该错误记录在 removeTimeout 函数中。)我在代码中以更多方式使用了猫鼬,但这之前还没有发生过,我也确实发现了其他人的这个错误的问题,但是没有找到合适的解决方案。

async function removeTimeout(leveldataid) {
    console.log("removetimeout")
    await mongo().then(async (mongoose) => {
        try {
            await levelSchema.findByIdAndUpdate(
                leveldataid,
                {
                    _id: leveldataid,
                    oncooldown: false
                },
                {upsert: true}
            )
        } catch(err) {
            console.log(err)
        } finally {
            mongoose.connection.close()
        }
    })


}

async function addXP(member, guild) {
    let data = undefined
    let changedleveldata = false
    await mongo().then(async (mongoose) => {
        try {
            data = await levelenabledSchema.findById(guild.id)
            if (data) {
                if (data.enabled == true) {
                    let extraxp = Math.floor(Math.random() *20) + 15
                    let leveldata = await levelSchema.findById(`guild${guild.id}member${member.id}`)
                    if (!leveldata) {
                        await levelSchema.findByIdAndUpdate(
                            `guild${guild.id}member${member.id}`,
                            {
                                _id: `guild${guild.id}member${member.id}`,
                                guild: guild.id,
                                level: 1,
                                maxXp: 113,
                                xp: extraxp,
                                oncooldown: true
                            },
                            {upsert: true}
                        )
                    } else {
                        if (leveldata.oncooldown == false) {
                            let newlevel = leveldata.level
                            let newMaxXp = leveldata.maxXp
                            newMaxXp = Math.floor(newMaxXp)
                            let xp = leveldata.xp

                            xp +=extraxp

                            if (xp > leveldata.maxXp) {
                                xp -=Math.floor(100*1.135**newlevel)
                                newlevel++
                                newMaxXp = 100*1.13**newlevel
                            }
                            await levelSchema.findByIdAndUpdate(
                                `guild${guild.id}member${member.id}`,
                                {
                                    level: newlevel,
                                    maxXp: newMaxXp,
                                    xp: xp,
                                    oncooldown: true
                                },
                                {upsert: true}
                            )
                        }
                    }
                }
            }
            changedleveldata = true
        } catch(err) {
            console.log(err)
        } finally {
            mongoose.connection.close()
        }
        if (changedleveldata == true) {
            setTimeout(remoteTimeout(`guild${guild.id}member${member.id}`), 60000)
        }
    })

}

【问题讨论】:

    标签: javascript mongodb mongoose discord.js


    【解决方案1】:

    这基本上意味着节点服务器和mongoDB之间的连接在写入数据时被中断了。

    解决您的问题的方法是从您的代码中删除 finally 块,因为它会在机器人被许多用户使用时中断连接,并且机器人在关闭之前的连接时尝试写入数据.

    await mongo().then(async (mongoose) => {
        try { // code here 
        } catch(e) { console.log(e); } 
    });
    

    【讨论】:

    • 我这样做了,但没有奏效,根据你的解释,我浏览了我的脚本,发现我在一个不同的函数中关闭了连接,该函数也在发送的每条消息中运行!感谢您让我知道为什么会这样!
    • np 乐于助人:D
    猜你喜欢
    • 2016-12-27
    • 2015-09-03
    • 2015-07-09
    • 2020-10-23
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多