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方法,常见触发场景:
- 模型引入路径错误:
require('./models/User')的相对路径与实际文件层级不匹配,导致加载失败。 - 模型加载时机问题:模型在Mongoose连接完成前被加载,导致模型初始化失败。
- 模型文件存在隐性语法错误(概率较低,因已确认模型定义无误)。
解决方法
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
相关产品推荐
相关产品推荐

