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
相关产品推荐
相关产品推荐

