MongooseError:Model.findOne()不再支持回调函数的问题求助
解决MongooseError: Model.findOne() no longer accepts a callback错误
你遇到的这个错误核心原因是:Mongoose从5.0版本开始,彻底废弃了给查询方法(比如findOne)传入回调函数的用法,所有这类查询方法现在都返回Promise,必须用异步语法来处理结果。
修改后的代码(推荐用async/await,逻辑更清晰)
async function send_log(guildId, embed) { try { // 用await替代回调,直接获取查询结果 const data = await logSchema.findOne({ Guild: guildId }); if (!data || !data.Channel) return; const LogChannel = client.channels.cache.get(data.Channel); // 原代码这里逻辑写反了,改成判断频道不存在就退出 if (!LogChannel) return; embed.setTimestamp(); await LogChannel.send({ embeds: [embed] }); } catch (err) { console.error('发送日志出错:', err); } }
关键修改点说明
- 把
send_log声明为async函数,这样就能用await来处理Mongoose返回的Promise - 移除了原代码里的回调参数,用
await直接接收findOne的查询结果 - 将错误处理统一放到外层的
try/catch中,比回调里的分散处理更易维护 - 修正了原代码的逻辑错误:原代码
if(LogChannel) return;会导致找到频道时直接退出,无法发送消息,改成if(!LogChannel) return;才是正确逻辑
备选方案(用Promise.then()语法)
如果不想用async/await,也可以用Promise链式调用的方式:
function send_log(guildId, embed) { logSchema.findOne({ Guild: guildId }) .then(data => { if (!data || !data.Channel) return; const LogChannel = client.channels.cache.get(data.Channel); if (!LogChannel) return; embed.setTimestamp(); return LogChannel.send({ embeds: [embed] }); }) .catch(err => { console.error('发送日志出错:', err); }); }
内容的提问来源于stack exchange,提问作者Joe Mama
相关产品推荐
相关产品推荐

