如何在 Angular Firebase 中修复浏览器刷新时的“TypeError:无法读取 null 的属性‘getIdToken’”?

2023-12-04

我在 Angular 8 中使用 Firebase 在前端和后端对用户进行身份验证。为了在后端对用户进行身份验证,我需要发送用户 ID 令牌。

我正在使用 firebase getIdToken 来获取令牌,它可以部分工作。刷新页面时出现错误“TypeError: Cannot read property 'getIdToken' of null”。

我尝试将令牌硬编码到 getToken() 方法中,即使在刷新时它也能工作,但这是不可行的,所以我使 getToken 方法返回 Observable。

该可观察量在 Http 拦截器 TokenInterceptorService 中获取,以将令牌添加到所有请求中。

export class AuthService {

  constructor(
    public afs: AngularFirestore,   // Inject Firestore service
    public afAuth: AngularFireAuth, // Inject Firebase auth service
    public router: Router,
    public ngZone: NgZone // NgZone service to remove outside scope warning
  ) {}


  // Other authentication methods for sign up etc.
  // removed here for readability


  getToken(): Observable<string> {

    // getIdToken() returns promise so using 'from' to 
    // convert it to an Observable
    const result = from(this.afAuth.auth.currentUser.getIdToken()
      .then( token => {
          console.log(token);
          return token;
      })
    );

    return result;
  }


}
export class TokenInterceptorService implements HttpInterceptor {


  constructor(private authService: AuthService) { }


  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return this.authService.getToken()
      .pipe(
        switchMap(token => {

          const newRequest = request.clone({
            setHeaders: {Authorization: `JWT ${token}`}
          });

          return next.handle(newRequest);

        })
      );

 }

}

我见过类似的问题我正在使用该解决方案并进行一些修改。

我什至尝试从 getToken() 方法返回承诺,但这也不起作用。


得到currentUser是异步的,因此预计最初它将是null。就像提到的文档:

Note: currentUser也可能为空,因为auth对象尚未完成初始化。

相反,你应该使用authState获取当前用户。然后从您从那里获得的用户中,您可以调用getIdToken(),它返回一个承诺。您可以使用from在那里将其转换为可观察的:

getToken(): Observable<string | null> {
  return this.afAuth.authState.pipe(
    take(1),
    switchMap((user) => {
      if (user) {
        return from(user.getIdToken())
      }
      return of(null);
    })
  )
}

然后在您的拦截器中,还检查令牌是否存在。如果没有用户则返回null

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Angular Firebase 中修复浏览器刷新时的“TypeError:无法读取 null 的属性‘getIdToken’”? 的相关文章

  • Javascript hasOwnProperty 在事件对象上总是 false?

    我希望有人可以帮助澄清与事件对象相关的 hasOwnProperty 方法 我正在尝试克隆鼠标事件 最终该对象将被传递到 iframe 我已经构建了一个 克隆 函数 但每当我尝试克隆窗口事件 即滚动 单击等 时 hasOwnProperty
  • 如何使用jquery格式化数字

    我正在尝试删除 之后的数字 然后我想格式化数字 16810900 211233 喜欢这个 16 810 900 但我不知道该怎么做 这是我的 html 是这样的 div class main p class active 10200 00
  • Javascript 自时间戳以来经过的时间

    我试图通过将其存储在变量中来 缓存 一些信息 如果 2 分钟过去了 我想获取 实时 值 调用 url 如果 2 分钟还没有过去 我想从变量中获取数据 我基本上想要的是 if time passed is less than 2 minute
  • Firestore 规则和带有可变键的自定义声明

    我正在寻找一种使用自定义声明来保护我的应用程序的方法 但我很难在 firestore 规则中访问它们 我的用户可以是多个 比如 1 到 5 个 组织的员工 我希望将 oganizationId 作为用户自定义声明中的关键 并将角色作为值 像
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • 使用 Charts.js 禁用动画

    我在使用 Charts js 关闭动画时遇到一些问题 这是我的代码 var pieData value 30 color F38630 value 50 color E0E4CC value 100 color 69D2E7 var myP
  • Angular2 本地组件/模板重用

    我正在编写一些 Angular2 模板 这些模板具有不同容器的重复部分 在这种情况下 如果对事物进行分组并且启用了多部分模式 则视图可能会发生变化 请原谅这个很长的例子 但是像这样
  • 每次页面重新启动时,Firebase.auth().currentUser 都会变为 null

    我正在使用 firebase 身份验证与 vue 应用程序 每次登录用户后重新启动页面时 currentUser 都会变为 null firebase auth signInWithEmailAndPassword this email t
  • 我什么时候应该使用内联和外部 Javascript?

    我想知道什么时候应该包含外部脚本或将它们与 html 代码内联编写 就性能和易于维护而言 这方面的一般做法是什么 真实场景 我有几个需要客户端表单验证的 html 页面 为此 我使用了一个包含在所有这些页面上的 jQuery 插件 但问题是
  • 如何垂直打印数组中的字符串元素? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个数组 我想垂直打印每个元素 例如 myArr abc def ghi 输出应该是 a d g b e h c f
  • 标记内的值发生变化时调用函数

    JavaScript 有没有什么方法可以在段落标记的值更改时调用函数 概述 HTML p 00 00 p
  • 上传前如何检查图片的宽度和高度

    对于图片上传 我编写了以下 html 代码
  • 使用 jQuery 更改 SVG 元素的“xlink:href”属性

    我正在尝试使用单击事件更改 xlink href 属性 到目前为止它部分有效 这就是我正在做的 HTML a href class ui btn ui corner all ui shadow editIcon style text ali
  • Firebase:获取对第一个项目/元素的引用

    我正在尝试获取对 firebase Array 中第一个项目的引用 就我而言 它会是 ElmmycgjS1Nvq albums IrdMMds 但我不确定如何构造查询 dbRef child ElmmycgjS albums child n
  • 根据数据更改图例颜色高图表

    我可以根据数据动态设置列的颜色 但无法弄清楚如何更改图例中的颜色 请注意 jsfiddle 最新的条形图是绿色的 但图例是蓝色的 有没有办法改变列颜色也会改变图例颜色 这是我用于列颜色的代码 jsfiddle http jsfiddle n
  • 单击时突出显示文本(javascript jquery html)

    当您在所有浏览器中双击某个单词时 它们会自动突出显示单击下的单词 但是否有可能找到一种方法exact单击一下就会发生同样的事情吗 我想这涉及到的事情可能是 TextRange 的东西 对所有段落 或整个正文或 div 的 onclick 做
  • 如何使用 Angular CLI 添加应用程序范围的 CSS 文件?

    我想向我的 Angular 2 应用程序添加一些分片样式 例如字体和配色方案等将在任何地方使用的东西 过去 我总是通过在索引页面添加这样的标签来完成此操作 这不适用于 CLI 用于为应用程序提供服务的任何内容 我尝试在构建后手动将 css
  • Bootstrap 3 - 模态背景不会根据模态对话框的高度调整大小?

    我将一个表单放入模式中 并尝试在用户触发单选按钮时显示表单的一些隐藏字段 显示隐藏字段后 模态自动重新缩放的高度 但模态背景的高度不能用作模态对话框 我该如何解决它 div class modal fade div class modal
  • 正则表达式获取两个方括号之间的数字

    您好 我需要使用正则表达式在 JavaScript 中获取两对方括号内的字符串 这是我的字符串 12 23 asd 到目前为止我尝试的是使用这种模式 d 我需要获得价值12使用正则表达式 您可以使用以下正则表达式 d 这将提取12 from
  • Firefox 和 Chrome 为 offsetTop 提供了不同的值

    我试图相对于输入字段定位一个跨度元素 让我们称之为 工具提示跨度 为此 我将工具提示跨度和输入字段包装在另一个跨度元素中 我们称之为 包装器跨度 该元素具有position relative 然后我设置position absolute在工

随机推荐

  • Eclipse Struts 2 Hibernate JPA 配置

    我正在使用 Eclipse 构建一个 Web 应用程序 我想在其中使用框架 Struts 2 和 Hibernate 这次我没有使用 Maven 只是因为我想知道如果我不使用 Maven 如何让它工作 Version 支柱2 5 休眠5 2
  • SignalR 和 OpenId 连接

    我有一个使用的服务器ASP NET Core Web Api and OpenIddict作为授权框架 现在我添加了一个SignalR主机并想为其添加授权 From 不同来源我找到SignalR JS 客户端 希望您在查询字符串中或通过 c
  • 更新 DOM 时相对定位的元素不会移动(IE6 和 IE7)

    我有一个带有几个字段集的表单 一个字段集具有用户设置的时间偏好表 用户可以添加和删除时间偏好 当他们添加一行时 表行会使用 jQuery 动态插入到 DOM 中append 问题在于 在 IE6 和 IE7 中 添加新的表格行时 页面上任何
  • 处理页错误陷阱后的指令指针值

    老实说 我真的对这个特定的虚拟内存相关概念感到困惑 Q1 当发生页错误时 处理器是否先完成当前指令的执行 然后将 IP 寄存器内容 下一条指令的地址 移入堆栈 或者 它中止当前正在执行的指令并将指令指针寄存器的内容移至堆栈 Q2 如果第二种
  • Kivy 时钟和弹出窗口

    如何正确为 switch id 和 switch id popup 创建活动属性 以便我可以使用 kivy 时钟在timer loop内部创建条件语句 我在类似的问题上得到了很好的反馈 再次感谢 eyllanesc 但由于涉及弹出窗口 我无
  • 通过Jsoup下载的网页源与实际的网页源不一样

    我对此感到严重关切 我已经搜索了堆栈溢出和许多其他网站 他们在每个地方都给出相同的解决方案 我已经尝试了所有这些 但我无法解决这个问题 我有以下代码 Document doc Jsoup connect url timeout 30000
  • Xamarin.Forms 中可重用的 XAML 控件

    我写了一篇不错的Grid与其他一些控件 例如 Entry and Image现在我想以最简单的方式重用它 这是我的控制Email财产
  • 将可枚举 linq 列表转换为类型化列表

    我遇到以下问题 我使用 linq 以这种方式过滤一些数据 var listPerson from objPerson in ListPerson select new objPerson IdPerson objPerson ApePers
  • Python - TypeError:浮点对象不可调用错误

    到目前为止已经得到以下代码 class beam object def init self E I L self E E self I I self L L self Loads 0 0 0 0 Force distance along b
  • 标题标签内的sup标签html

    我需要注册商标作为工具提示中的上标 我尝试使用sup标题标签内 p title Hello World p 但我明白了sup在工具提示中 如何确保忽略sup标签并且R在工具提示内显示为上标 Use reg 反而 你也许也可以写
  • 内存映射文件有哪些优点?

    我一直在研究一个项目的内存映射文件 并且非常感谢以前使用过它们或决定不使用它们的人的任何想法 为什么 我特别担心以下问题 按重要性排序 并发性 随机访问 表现 使用方便 可移植性 我认为优点实际上是与传统的读取文件方法相比 减少了所需的数据
  • 使用 PHPMailer 发送 unicode 表情符号

    我正在尝试通过 PHPMailer 5 2 发送 unicode 表情符号 但我发送的电子邮件收到的是奇怪的字符而不是表情符号 我目前正在发送 HTML 电子邮件 我刚刚echo包含一些 utf 8 表情符号的字符串并检查电子邮件源 该字符
  • 拖放多个文件的批处理文件?

    我希望能够完成与下面类似的事情 但是使用 pcutmp3 拖放多个文件的批处理文件 我很难理解 Joey 所做的添加 因为我通常不这样做 但我想将多个文件 cue 放在一个批处理文件上并让它运行多次 这就是批处理文件中的以下行发生 echo
  • 致命错误:C 中超出了 30 秒的最大执行时间:[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我对这个错误感到非常震惊 根本无法得到它 Fatal
  • 返回 AsAsyncEnumerable() 时出现 ObjectDisposeException

    在我的 NET Core 3 WebAPI 项目中 我有以下简单的方法调用 HttpGet ViewerRoles public IAsyncEnumerable
  • 如何实现链表的前置而不需要分配给新变量?

    有人告诉我如何实现链表 enum List Cons u32 Box
  • 如何在一行中增加或减少现有词典键的数值

    在Java中 可以增加或减少数值one line向 a 添加元素时HashMap 有没有办法在C 中做到这一点Dictionary 以Java为例 hashMap put key hashMap getOrDefault key 0 1 I
  • 将 Android 库项目添加到 Eclipse 构建路径?

    我有一个多模块 Android Maven 项目 它由多个项目和一个 Android 库项目 baselib 组成 我在其中运行非基于 Android 的 JUnit 测试 只要我通过 Maven 运行测试就可以了 当我使用 Run gt
  • 在shinydashboard中动态创建可排序的menuSubItems

    我有一个闪亮的应用程序 使用shinydashboard我在其中动态创建的包menuSubItem是在sidebarMenu of a dashboardSidebar 子项的创建由操作按钮触发 我可以创建menuSubItem在服务器端就
  • 如何在 Angular Firebase 中修复浏览器刷新时的“TypeError:无法读取 null 的属性‘getIdToken’”?

    我在 Angular 8 中使用 Firebase 在前端和后端对用户进行身份验证 为了在后端对用户进行身份验证 我需要发送用户 ID 令牌 我正在使用 firebase getIdToken 来获取令牌 它可以部分工作 刷新页面时出现错误