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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:48:25