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

JWT策略配置报错:TypeError: done is not function及未处理Promise拒绝

JWT配置报错:TypeError: done is not a function 及未处理Promise拒绝问题

问题代码

let jwtoptions = {};
jwtoptions.jwtFromRequest = ExtractJWT.fromAuthHeaderAsBearerToken();
jwtoptions.secretOrKey = DB.secret;
let Strategy = new JWTStrategy(jwtoptions,(jwt_payload,done)=>{
  User.findById(jwt_payload.id)
  .then(User =>{
    return done(null, User);
  })
  .catch(err =>{
    return done(err,false);
  })
})
passport.use(Strategy);

报错信息

(node:14224) UnhandledPromiseRejectionWarning: TypeError: done is not a function
(node:13568) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

解决方案

1. 修正回调逻辑(解决done is not a function)

passport-jwt新版对Promise支持更完善,推荐用async/await语法替代Promise链式调用,无需手动调用done,passport会自动处理验证结果:

let jwtoptions = {};
jwtoptions.jwtFromRequest = ExtractJWT.fromAuthHeaderAsBearerToken();
jwtoptions.secretOrKey = DB.secret;

let Strategy = new JWTStrategy(jwtoptions, async (jwt_payload) => {
  const user = await User.findById(jwt_payload.id);
  if (!user) {
    throw new Error('用户不存在');
  }
  return user;
});

passport.use(Strategy);

如果坚持用Promise链式调用,需修正变量名冲突(避免then参数覆盖模型名),并直接调用done:

let Strategy = new JWTStrategy(jwtoptions,(jwt_payload,done)=>{
  User.findById(jwt_payload.id)
  .then(user =>{
    done(null, user);
  })
  .catch(err =>{
    done(err, false);
  })
})

2. 解决未处理Promise拒绝

除了在查询逻辑后添加.catch,可在项目入口添加全局兜底处理,避免遗漏未捕获的Promise错误:

process.on('unhandledRejection', (err) => {
  console.error('未处理的Promise拒绝:', err);
  // 可根据需求添加日志上报等扩展逻辑
});

3. 版本兼容性检查

如果上述方法无效,确认依赖版本兼容:

  • 确保passport版本在0.4.x及以上
  • 确保passport-jwt版本在4.x及以上

查看当前版本的命令:

npm list passport passport-jwt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:50:14