Конвертировать наблюдаемый <Object>в строку - PullRequest
1 голос
/ 21 апреля 2020

Я нашел этот пример службы для получения IP-адреса.

Эта служба возвращает Observable<Object>, который я хотел бы присвоить / сохранить в String- Переменная.

  getIpAddress() {
    return this.http
          .get('https://api.ipify.org/?format=json')
          .pipe(
            catchError(this.handleError)
          );
  }

Я все еще не очень "обучен" с Observables. Я внедрил эту Службу в свою собственную Службу (Службу аутентификации), где я пытаюсь получить доступ к фактическому значению, которое будет представлять собой строку.

Я знаю, что мне придется подписаться и передать / отобразить карту чтобы использовать его, но вот где я потерян ...

console.log(this.visitorService.getIpAddress().subscribe(ip => this.ipAdress = ip ?? ));

Наконец, я хочу использовать IP-адрес (строку) внутри моего метода входа в систему (где будет console.log заменил, и API получил этот третий параметр тела)

  login(username: string, password: string): Observable<User> {
    // der globale interceptor (jwt) hängt halt auch hier das authorization header feld hinzu; macht nichts

    console.log(this.visitorService.getIpAddress().subscribe(ip => this.ipAdress = ip ?? ));

    return this.http.post<UserRaw>(
      `${environment.apiUrl}/login`, { username, password } )
      .pipe(map(userRaw => UserFactory.fromRaw(userRaw)))
      .pipe(map(user => {
        // local storage = client persistence (user bleibt eingeloggt)
        localStorage.setItem('currentUser', JSON.stringify(user));
        this.currentUserSubject.next(user);
        // console.log(user.username);
        return user;
    }));

ОБНОВЛЕНИЕ

this.visitorService.getIpAddress().subscribe(ip => { console.log(ip); } );

возвращает IP Object in Console

но после этого я не могу получить к нему доступ / конвертировать: - /

this.visitorService.getIpAddress().subscribe(ip => { this.ipAdress = ip.ip } );

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Если вы хотите вывести IP-адрес на консоль, вы можете сделать это только после того, как значение «прибудет»:

this.visitorService.getIpAddress().subscribe(ip => {
    console.log(ip);
    this.ipAdress = ip;
});
1 голос
/ 21 апреля 2020

Просто используйте желаемое свойство, и это хорошая практика для обработки ошибок. Вы можете увидеть, какие свойства доступны, используя console.log() - он покажет ваши свойства:

console.log(this.visitorService.getIpAddress()
    .subscribe(ip => {
        console.log(`your ip`, ip);
        this.ipAdress = ip['yourProperty'];
        },
    err => {
        console.log(err);
    });

ОБНОВЛЕНИЕ:

Ваш код выглядит нормально для меня. Однако его можно улучшить, используя метод pipe только один раз. pipe метод используется для цепочки методов:

login(username: string, password: string): Observable<User> {
    // der globale interceptor (jwt) hängt halt auch 
    // hier das authorization header feld hinzu; macht nichts

    return this.http.post<UserRaw>(
      `${environment.apiUrl}/login`, { username, password } )
      .pipe(map(userRaw => UserFactory.fromRaw(userRaw)),
            map(user => {
               // local storage = client persistence (user bleibt eingeloggt)
               localStorage.setItem('currentUser', JSON.stringify(user));
               this.currentUserSubject.next(user);
               // console.log(user.username);
               return user;
      }));

Вы можете прочитать больше в Angular 2 Руководство по стилю

...