Я пытаюсь получить идентификатор пользователя от текущего пользователя, вошедшего в систему, чтобы настроить данные, загружаемые из моего DataService . Моя цель:

  1. AuthGuard следует вызывать до загрузки InboxComponent.
  2. Этот AuthGuard должен установить переменную user в AuthService
  3. После этого я смогу использовать authService.user в DataService.

Однако console.log(this.authService.user) возвращает значение undefined, хотя console.log(authState) в AuthGuard правильно регистрирует информацию о пользователе.

Есть какие-нибудь подсказки о том, что могло быть не так?

Служба аутентификации

export class AuthService {

  public user: any;

  constructor(private af: AngularFire, public auth$: FirebaseAuth) {
    console.log("Auth service state:", this.authState);
  }

< Сильный > AuthGuard

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(): Observable<boolean> {
    return this.authService.auth$
      .take(1)
      .map(authState => {
        console.log(authState)
        this.authService.setUser(authState);
        return !!authState })
      .do(authenticated => {
        if (!authenticated) {
          this.router.navigate(['/error']);
        }
      });
  }

}

Служба данных

export class DataService {

  private userPath: string;

  constructor(private af: AngularFire, private authService: AuthService) {
     console.log(this.authService.user);
  }

Маршрутизатор

const routes: Routes = [
  { path: 'inbox',  component: InboxComponent, canActivate: [AuthGuard] }

Модуль приложения

@NgModule({
  declarations: [
    InboxComponent
  ],
  imports: [
    EmailsModule
  ],
  providers: [
    AuthService,
    AuthGuard
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }
0
user3642173 16 Дек 2016 в 00:06
AuthService синглтон? Где вы его предоставляете ?
 – 
Sasxa
16 Дек 2016 в 00:11
Я отредактировал свой вопрос выше с помощью кода импорта модуля. Я импортирую AuthGuard в модуль приложения и InboxComponent в отдельный модуль, EmailsModule, который я импортирую в модуль приложения.
 – 
user3642173
16 Дек 2016 в 00:31
this.authService.setUser(authState); работает? Что произойдет, если вы замените эту строку на this.authService.user = authState;?
 – 
Sasxa
16 Дек 2016 в 00:54
Я пробовал это. К сожалению, это не помогает. Я попытался выйти из системы при вызове различных служб и добавить console.log непосредственно перед тем, как установить this.authService.user = authState ;. Они вызываются в следующем порядке: 1) Вызывается служба аутентификации 2) Вызывается служба DataService 3) console.log AuthGuard (authState) - похоже, это может быть проблемой. Любая подсказка, почему AuthGuard вызывается после DataService?
 – 
user3642173
16 Дек 2016 в 01:06
Конструкторы выполняются при создании объектов, поэтому. Вы можете сделать получателя пользователя внутри DataService: get user() { return this.authService.user; }. Он по-прежнему будет неопределенным в конструкторе, но везде внутри службы вы должны получить правильное значение ...
 – 
Sasxa
16 Дек 2016 в 01:11

1 ответ

Лучший ответ

Я наконец решил это. У меня был вызов службы DataService в моем файле app.component.ts, чтобы получить некоторые данные в моей навигации. Он загружается вне модуля-маршрутизатора и поэтому вызывается до вызова AuthService. Это, в свою очередь, вызвало DataService перед вызовом AuthGuard.

0
user3642173 16 Дек 2016 в 17:11
Но как ты это исправил?
 – 
Matheno
10 Окт 2018 в 14:14