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

Discord Bot开发调用Mongoose的findOne方法时出现TypeError报错

解决Discord.js + Mongoose中Cannot read properties of undefined (reading 'findOne')错误

问题场景

使用Discord.js与Mongoose开发Discord机器人时,通过Discord ID调用findOne查询User模型,触发以下错误:

TypeError: Cannot read properties of undefined (reading 'findOne')

业务代码:

const User = require('./models/User');

client.on('messageCreate', async (msg) => {
  if (msg.content === '!myinfo') {
    const discordId = msg.author.id;

    const user = await User.findOne({ discordId });

    if (!user) {
      msg.channel.send('You are not registered');
      return;
    }

    msg.channel.send(`Your username is: ${user.username}`);
  }
});

User模型定义:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
  },
  discordId: {
    type: String,
    required: true,
    unique: true,
  },
});

module.exports = mongoose.model('User', userSchema);

已确认Mongoose连接正常、模型定义无误,以下是错误原因及解决方法:


错误原因

核心问题是User变量为undefined,导致无法调用findOne方法,常见触发场景:

  1. 模型引入路径错误:require('./models/User')的相对路径与实际文件层级不匹配,导致加载失败。
  2. 模型加载时机问题:模型在Mongoose连接完成前被加载,导致模型初始化失败。
  3. 模型文件存在隐性语法错误(概率较低,因已确认模型定义无误)。

解决方法

1. 修正模型引入路径

先确认业务代码文件与User.js的位置关系:

  • 若业务文件在根目录,models文件夹也在根目录,./models/User是正确路径;
  • 若业务文件在子文件夹(如commands/),需调整为../models/User;
  • 可以用绝对路径确保加载正确:
    const path = require('path');
    const User = require(path.join(__dirname, './models/User'));
    
    __dirname会指向当前业务文件所在目录,避免相对路径混乱。

2. 确保模型在Mongoose连接后加载

即使确认连接正常,也要保证模型加载在连接成功之后执行:

const mongoose = require('mongoose');
const Discord = require('discord.js');

mongoose.connect('mongodb://localhost:27017/your-db-name')
  .then(() => {
    console.log('MongoDB连接成功');
    // 连接完成后再加载模型和启动Discord客户端
    const User = require('./models/User');
    const client = new Discord.Client({ intents: [/* 你的权限配置 */] });

    client.on('messageCreate', async (msg) => {
      // 业务逻辑
    });

    client.login('你的机器人Token');
  })
  .catch(err => console.error('MongoDB连接失败:', err));

3. 验证模型导出是否正常

在User.js末尾添加日志,启动机器人查看输出:

const UserModel = mongoose.model('User', userSchema);
console.log('User模型导出结果:', UserModel);
module.exports = UserModel;

如果控制台输出User模型导出结果: Model { User },说明模型导出正常;若输出undefined,检查模型文件是否有语法错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:01:18