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

使用await调用findOne仍报findById无回调错误的问题排查

问题分析与解决方案

你遇到的错误提示是findById() no longer accepts a callback,但你贴出的代码里并没有调用findById方法,问题大概率出在未展示的serializeUser或deserializeUser配置代码中——很多人会在这两个方法里使用User.findById(id, done)这种带回调的写法,而mongoose新版本已经彻底移除了对回调函数的支持。

解决步骤:

  1. 检查并修复序列化/反序列化代码
    找到你项目中passport.serializeUser和passport.deserializeUser的配置部分,把带回调的findById调用改成async/await形式:

    错误写法(会触发报错):

    passport.deserializeUser((id, done) => {
      User.findById(id, (err, user) => {
        done(err, user);
      });
    });
    

    正确写法:

    passport.deserializeUser(async (id, done) => {
      try {
        const user = await User.findById(id);
        done(null, user);
      } catch (err) {
        done(err);
      }
    });
    

    serializeUser部分一般不需要查询,保持原有写法即可:

    passport.serializeUser((user, done) => {
      done(null, user.id);
    });
    
  2. 确认现有代码的正确性
    你在LocalStrategy中使用await User.findOne({username})的写法是完全符合mongoose新版本要求的,async函数作为passport的回调是被支持的,只要你通过done方法正确处理结果和错误,这部分代码没有问题。

  3. 排查其他潜在问题
    如果修复后仍有报错,检查项目中其他调用mongoose查询方法(比如find、findOneAndUpdate等)的地方,确保没有遗漏的带回调的写法,全部替换为Promise或async/await形式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:22:35