使用await调用findOne仍报findById无回调错误的问题排查
问题分析与解决方案
你遇到的错误提示是findById() no longer accepts a callback,但你贴出的代码里并没有调用findById方法,问题大概率出在未展示的serializeUser或deserializeUser配置代码中——很多人会在这两个方法里使用User.findById(id, done)这种带回调的写法,而mongoose新版本已经彻底移除了对回调函数的支持。
解决步骤:
检查并修复序列化/反序列化代码
找到你项目中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); });确认现有代码的正确性
你在LocalStrategy中使用await User.findOne({username})的写法是完全符合mongoose新版本要求的,async函数作为passport的回调是被支持的,只要你通过done方法正确处理结果和错误,这部分代码没有问题。排查其他潜在问题
如果修复后仍有报错,检查项目中其他调用mongoose查询方法(比如find、findOneAndUpdate等)的地方,确保没有遗漏的带回调的写法,全部替换为Promise或async/await形式。
内容的提问来源于stack exchange,提问作者LPoehl
相关产品推荐
相关产品推荐

