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

Angular调用Firebase Auth自定义服务时出现Class extends value undefined错误

解决Angular Firebase认证服务的"Class extends value undefined"错误

核心问题分析

这个错误源于undici库(Firebase依赖的HTTP客户端)的构造函数未正确加载,大概率是Angular Fire与Angular版本不兼容,或者Firebase初始化流程有误,也可能是SSR环境下的认证逻辑冲突。

具体修复步骤

1. 确保Angular Fire与Angular版本匹配

Angular 18必须搭配@angular/fire 18.x版本。执行以下命令更新依赖:

npm install @angular/fire@latest firebase@latest

2. 完善Firebase初始化配置

在Angular 18的独立配置文件(app.config.ts)中,正确提供Firebase应用和Auth服务:

import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideFirebaseApp, initializeApp } from '@angular/fire/app';
import { provideAuth, getAuth } from '@angular/fire/auth';

// 替换为你的Firebase项目配置
const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_SENDER_ID",
  appId: "YOUR_APP_ID"
};

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(routes),
    provideFirebaseApp(() => initializeApp(firebaseConfig)),
    provideAuth(() => getAuth())
  ]
};

3. 修复AuthService的认证状态判断

currentUser是同步属性,页面初始化时可能尚未完成Firebase Auth的初始化,导致结果不可靠。改用authState observable监听认证状态:

import { Injectable } from '@angular/core';
import { Auth, authState } from '@angular/fire/auth';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  isUserSignedIn$: Observable<boolean>;

  constructor(private auth: Auth) {
    this.isUserSignedIn$ = authState(this.auth).pipe(
      map(user => !!user)
    );
  }
}

4. 更新Navbar组件逻辑

在组件中订阅observable获取实时状态,同时实现生命周期钩子清理订阅:

import { NgClass } from '@angular/common';
import { Component, OnInit, OnDestroy } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';
import { AuthService } from '../../service/auth/auth.service';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-navbar',
  standalone: true,
  imports: [RouterLink, RouterLinkActive, NgClass],
  templateUrl: './navbar.component.html',
  styleUrl: './navbar.component.css'
})
export class NavbarComponent implements OnInit, OnDestroy {
  isUserSignIn: boolean = false;
  private authSubscription?: Subscription;

  constructor(private authService: AuthService) {}

  ngOnInit(): void {
    this.authSubscription = this.authService.isUserSignedIn$.subscribe(isSignedIn => {
      this.isUserSignIn = isSignedIn;
    });
  }

  ngOnDestroy(): void {
    this.authSubscription?.unsubscribe();
  }
}

5. 处理SSR环境(如果启用了Angular Universal)

如果应用使用SSR,Firebase Auth无法在服务器端运行,需在服务中判断运行环境:

import { Injectable, PLATFORM_ID, Inject } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { Auth, authState } from '@angular/fire/auth';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  isUserSignedIn$: Observable<boolean>;

  constructor(
    @Inject(PLATFORM_ID) private platformId: Object,
    private auth: Auth
  ) {
    if (isPlatformBrowser(this.platformId)) {
      this.isUserSignedIn$ = authState(this.auth).pipe(map(user => !!user));
    } else {
      // 服务器端默认返回未登录状态
      this.isUserSignedIn$ = of(false);
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:58:23