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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:17