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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:18:02