Mongoose 错误:“拓扑被破坏”,有啥问题?

Posted

技术标签:

【中文标题】Mongoose 错误:“拓扑被破坏”,有啥问题?【英文标题】: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.idmember$member.id`)
                    if (!leveldata) 
                        await levelSchema.findByIdAndUpdate(
                            `guild$guild.idmember$member.id`,
                            
                                _id: `guild$guild.idmember$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.idmember$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.idmember$member.id`), 60000)
        
    )


【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我这样做了,但没有奏效,根据你的解释,我浏览了我的脚本,发现我在一个不同的函数中关闭了连接,该函数也在发送的每条消息中运行!感谢您让我知道为什么会这样! np 乐于助人:D

以上是关于Mongoose 错误:“拓扑被破坏”,有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:拓扑被破坏 MongoError

MongoError:拓扑被破坏sailsjs

MongoError:拓扑被破坏sailsjs

Mongolab nodejs拓扑被破坏

Mongolab nodejs拓扑被破坏

MongoError:拓扑被破坏,我该如何修复它? [复制]