PassportJS中调用异步函数出现ReferenceError等报错如何解决
问题原因及修复方案
1. getUserByToken未定义错误
- 如果
getUserByToken和passport.use的代码不在同一个文件,需要在passport配置文件顶部导入该函数:import { getUserByToken } from './你的文件路径' - 如果两个逻辑在同一个文件,检查定义顺序:
const定义的变量不存在变量提升,必须保证getUserByToken的定义写在passport.use逻辑之前,不能先调用后定义 - 额外修复:原
getUserByToken内解构了data但返回了未定义的user变量,需要改为返回data
2. done不是函数错误
- 检查
BearerStrategy的配置是否开启了passReqToCallback: true,开启后校验回调的参数顺序会变为(req, accessToken, done),如果没有对应调整参数接收顺序,第二个参数拿到的实际是token,不是done函数,调用自然报错 - 必须在所有逻辑分支调用
done回调:拿到用户信息后要调用done(null, user)返回结果,出现错误要调用done(error)传递错误,没有调用done也会触发passport内部报错
3. 未处理的Promise拒绝错误
- 上述两个错误触发后,async函数抛出的异常没有被正确传递给passport的错误处理逻辑,你虽然写了catch块,但只打印了日志,没有把错误传给done回调,导致Promise rejection没有被捕获
修复后完整代码
import { Strategy as BearerStrategy } from "passport-http-bearer"; // 如果getUserByToken在其他文件,取消下一行注释并替换为实际路径 // import { getUserByToken } from './你的文件路径' // 必须先定义函数,再在后续逻辑中调用 export const getUserByToken = async (accessToken: string) => { try { const { data } = await auth.post("/api/me", { accessToken }); // 修复返回值,返回接口拿到的用户数据 return data; } catch (error) { console.log({ error }); // 抛出异常让外层catch块捕获 throw error; } }; passport.use( "auth.jwt", // 如果你开启了passReqToCallback配置,回调参数要调整为 (req, accessToken, done) new BearerStrategy(async function (accessToken, done) { try { const user = await getUserByToken(accessToken); // 校验成功调用done返回用户信息 return done(null, user); } catch (error) { console.log(error); // 校验失败调用done传递错误 return done(error); } }) );
内容的提问来源于stack exchange,提问作者sumeyyeemir
相关产品推荐
相关产品推荐

