Mongoose操作levels.findOne()超时崩溃问题求助
修复Discord.js等级系统/rank命令崩溃问题
你遇到的MongooseError: Operation levels.findOne() buffering timed out after 10000ms错误,核心原因是Mongoose未成功连接MongoDB数据库,同时代码中存在几处语法/逻辑错误,导致问题恶化。以下是具体修复方案:
1. 确保Mongoose完成数据库连接
必须在启动Discord机器人前,确认Mongoose已成功连接MongoDB,否则所有数据库操作都会超时。在项目入口文件(如index.js/main.js)中添加正确的连接逻辑:
const mongoose = require('mongoose'); require('dotenv').config(); // 若使用环境变量存储连接字符串 async function connectDB() { try { await mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true, serverSelectionTimeoutMS: 5000 // 缩短超时等待时间 }); console.log('MongoDB连接成功'); } catch (err) { console.error('MongoDB连接失败:', err); process.exit(1); // 连接失败直接退出,避免后续无效操作 } } // 先连接数据库,再启动机器人 connectDB().then(() => { client.login(process.env.DISCORD_TOKEN); });
2. 修复/rank命令代码中的错误
修正代码里的拼写错误、逻辑漏洞,并提前处理Discord交互超时问题:
const { SlashCommandBuilder } = require('@discordjs/builders'); const { AttachmentBuilder, EmbedBuilder } = require(`discord.js`); const { Canvacord } = require('canvacord'); const levelSchema = require(`../../Schemas.js/level`); module.exports = { data: new SlashCommandBuilder() .setName('rank') .setDescription("Get a server member's XP rank") .addUserOption(option => option.setName('target').setDescription("This is the user you want to check the XP rank of.").setRequired(false)), async execute(interaction) { // 提前回复Discord正在处理,避免出现"Application did not respond" await interaction.deferReply(); const { options, user, guild } = interaction; // 处理target为空的情况,默认使用命令执行者 const targetUser = options.getUser('target') || user; const member = guild.members.cache.get(targetUser.id); try { const Data = await levelSchema.findOne({ Guild: guild.id, User: targetUser.id }); if(!Data) { const embed = new EmbedBuilder() .setColor('Blue') .setTitle(`${targetUser.username}'s XP Rank`) .setDescription(`${targetUser.username} has not gained any XP yet.`); return await interaction.editReply({ embeds: [embed] }); } const Required = Data.Level * Data.Level * 20 + 20; const rank = new Canvacord.rank() .setAvatar(targetUser.displayAvatarURL({ forceStatic: true})) // 修正拼写错误:forseStatic → forceStatic .setBackground("IMAGE", `https://cdn.discordapp.com/attachments/1055548593186025513/1057353099720798308/OIP.jpg`) .setCurrentXP(Data.XP) .setRequiredXP(Required) .setRank(1, "Rank", false) .setLevel(Data.Level, "Level") .setUsername(targetUser.username) .setDiscriminator(targetUser.discriminator); const Card = await rank.build(); const attachment = new AttachmentBuilder(Card, { name: "rank.png" }); const embed2 = new EmbedBuilder() .setColor("Blue") .setTitle(`${targetUser.username}'s XP Rank`) .setImage("attachment://rank.png"); await interaction.editReply({ embeds: [embed2], files: [attachment] }); } catch (err) { console.error('执行rank命令出错:', err); await interaction.editReply({ content: '获取等级信息时出错,请稍后重试。' }); } } }
3. 额外排查点
- 检查
levelSchema路径是否正确:确认../../Schemas.js/level文件存在,且导出了正确的Mongoose模型 - 验证MongoDB服务状态:确保本地/远程MongoDB服务正在运行,连接字符串中的地址、端口、认证信息无误
内容的提问来源于stack exchange,提问作者Liam Shumaker
相关产品推荐
相关产品推荐

