Mongoose报错:Model.findOne()不再接受回调函数,求解决方案
解决Mongoose
Model.findOne() 不支持回调的报错 错误原因
你使用的Mongoose版本(6.x及以上)已彻底移除了findOne()方法对回调函数的支持,所有数据库查询方法现在仅返回Promise,必须用async/await或Promise链式调用处理结果。
修改后的代码(推荐用async/await)
const { SlashCommandBuilder } = require('@discordjs/builders'); const testSchema = require(`../../Schemas.js/test`); module.exports = { data: new SlashCommandBuilder() .setName('dbtest') .setDescription('db test'), async execute(interaction) { try { // 用await获取查询结果,替代原回调写法 const data = await testSchema.findOne({ GuildID: interaction.guild.id, UserID: interaction.user.id }); if (!data) { // 用await确保数据创建完成 await testSchema.create({ GuildID: interaction.guild.id, UserID: interaction.user.id }); console.log('新用户数据已创建'); } else { console.log('查询到用户数据:', data); } } catch (err) { // 捕获并处理数据库错误,避免程序崩溃 console.error('数据库操作失败:', err); } } }
关键修改点
- 移除
findOne()的回调参数,改用await直接获取返回结果 - 用
try/catch块包裹数据库操作,统一处理错误(替代原回调里的throw err,更安全) - 对
create()操作也添加await,确保数据写入完成后再继续执行
可选:Promise链式调用写法
如果你习惯用Promise的.then()/.catch(),也可以这样写:
const { SlashCommandBuilder } = require('@discordjs/builders'); const testSchema = require(`../../Schemas.js/test`); module.exports = { data: new SlashCommandBuilder() .setName('dbtest') .setDescription('db test'), execute(interaction) { testSchema.findOne({ GuildID: interaction.guild.id, UserID: interaction.user.id }) .then(data => { if (!data) { return testSchema.create({ GuildID: interaction.guild.id, UserID: interaction.user.id }); } console.log('查询到用户数据:', data); }) .then(() => { console.log('新用户数据已创建'); }) .catch(err => console.error('数据库操作失败:', err)); } }
内容的提问来源于stack exchange,提问作者akim
相关产品推荐
相关产品推荐

