Angularfire2 и Rxjs Observable не запускают методы Catch и Complete

я выполнил аутентификацию на своем сайте, он работает нормально, но я хочу обрабатывать ошибки, для тестирования я вызвал одну для этой цели с этим возвратом из firebase: «Учетная запись уже существует с тем же адресом электронной почты, но другими учетными данными для входа. Войдите, используя провайдера, связанного с этим адресом электронной почты.". Я пытаюсь написать наблюдаемый RXjs для этого со следующим кодом:

private subscribleAuth() {
    this.af.auth
        .subscribe(
            auth => {
                this._auth = auth && auth.auth ? auth.auth : null;
                if (this._auth) {
                    this.loginState = 'logged';
                } else {
                    this.loginState = 'login';
                }

            },
            err => {
                console.log('error'),
                    this.loginState = 'error';
            },
            () => { console.log('done.') }
        );
}

Моя консоль никогда не показывает «ошибку» или «готово», поэтому все, что я помещаю в код ошибки, не работает.

введите здесь описание изображения

примечание: я знаю, что вызывает этот возврат firebase, я просто хочу знать, как с ним обращаться и почему написанный мной код не работает должным образом, когда никаких ошибок не возвращается, сайт работает, как ожидалось, с тем же наблюдаемым.

Я использую angularfire2: ^ 2.0.0-beta.5 с финальной версией Angular 2.0.0.

РЕДАКТИРОВАТЬ 1: даже официальный проект github сообщает вам, чтобы получить пользователя в качестве наблюдаемого и подписаться на него в разделе «Переопределить конфигурацию» / «Нет конфигурации». Пример приложения..

РЕДАКТИРОВАТЬ 2: отмечено как проблема и, возможно, это действительно ошибка, я буду обновлять этот пост. Обходной путь на данный момент использует этот код, написанный yashmurty на github:

import { AngularFire, AuthProviders } from 'angularfire2';
import { AuthBackend } from 'angularfire2/auth/auth_backend';

export class SocialmenuComponent {
    constructor(public af: AngularFire, private _authBackend: AuthBackend) {
        // this.af.auth.subscribe(
        this._authBackend.getRedirectResult().subscribe(
            (auth) => {
                if(auth) {
                  console.log(auth);
                } else {
                  console.log('User Not Logged In');
                }
            },
            (err) => {
                if(err) {
                  console.log('Error in auth.subscribe : ');
                  console.log(err);
                } else {
                  console.log('No Error detected in auth.subscribe');
                }
            },
            () => { console.log('done.') }
        );
    }
}

person Hllink    schedule 26.09.2016    source источник
comment
Вы имеете в виду эту строку this.af.auth.subscribe(auth => console.log(auth));? Но это не то, что вы делаете. Посмотрите в самый низ: github. com/angular/angularfire2/blob/master/docs/ Они привязывают .then() и .catch() к возвращенному Promise от auth().signInWithCredential(provider). Вот как вы можете ловить ошибки.   -  person martin    schedule 27.09.2016
comment
это случай с apache cordova, который тоже должен работать, если я использую метод всплывающего окна, я использую метод перенаправления, поэтому страница перенаправляется на страницу поставщика, теряя все переменные/состояния в памяти (и функция then вызывается перед перенаправлением ), еще раз, когда он вернется на мою страницу, если я вызову auth.login, он снова перенаправит на страницу провайдера в бесконечном цикле...   -  person Hllink    schedule 27.09.2016
comment
Я могу поймать такую ​​​​ошибку, но я все еще получаю исключения в error_handler.js и Subscriber.js — они, кажется, прерывают выполнение программы — есть ли способ заставить замолчать/игнорировать эти ошибки?   -  person Per Hornshøj-Schierbeck    schedule 21.10.2016
comment
я не знаю, это был просто обходной путь, с этого момента я использую метод всплывающих окон, пока они не исправят проблему.   -  person Hllink    schedule 21.10.2016


Ответы (2)


О любых ошибках, возникающих при вызове методов createUser или login наблюдаемого объекта AngularFire2 auth, сообщается через возвращаемые промисы, а не через наблюдаемый объект.

Например:

import { AngularFire } from 'angularfire2';

...
class MyComponent {

  constructor(af: AngularFire) {

    af.auth.createUser({
      email: '[email protected]',
      password: 'somepassword'
    })
    .then((authState) => { console.log('success'); })
    .catch((error) => { console.log('failure'); });
  }

При аутентификации с использованием метода, который включает перенаправление, вы можете сделать что-то вроде этого (jeffbcross решение с github):

import { FirebaseApp } from 'angularfire2';
import * as firebase from 'firebase';

...
class MyComponent {

  constructor(@Inject(FirebaseApp) fbApp: firebase.App) {

    fbApp.auth().getRedirectResult()
    .then((userCredential) => { console.log('success'); })
    .catch((error) => { console.log('failure'); });
  }
}
person cartant    schedule 26.09.2016
comment
Об ошибках не сообщается через наблюдаемое, поэтому обратный вызов ошибки наблюдателя никогда не вызывается. - person cartant; 27.09.2016
comment
удалил мои комментарии, потому что они могли сбить людей с толку, спасибо! - person Hllink; 17.11.2016

Я проверяю исходный код angular/angularfire2/blob/master/src/auth/auth.ts и вижу его. никогда не вызывает ни error(), ни complete(), поэтому поведение правильное. Он просто вызывает next() при успешном входе в систему.

Это просто не то, как вы должны использовать AngularFire.auth. Вызов this.af.auth.login() возвращает firebase.Promise<FirebaseAuthState>, который отклонен из-за отсутствия учетных данных или внутренне в в одном из этих случаев, поэтому Observer (вызов subscribe()) не место для обработки ошибок.

person martin    schedule 27.09.2016
comment
Итак, я использую вход в систему с помощью перенаправления, каждый раз, когда страница загружается, если я вызываю this.af.auth.login(), она перенаправляет страницу, и после аутентификации провайдера она возвращается на мою страницу, она снова вызывается, чтобы получить состояние и превращается в бесконечный цикл путем повторного перенаправления, есть ли другой способ получить состояние регистрации пользователя или единственный способ - использовать метод всплывающего окна вместо перенаправления? - person Hllink; 27.09.2016
comment
Когда вы используете перенаправление вместо всплывающего окна, которое вам нужно использовать, если вы работаете с мобильным устройством, вас не будет рядом, чтобы поймать эту ошибку. - person Per Hornshøj-Schierbeck; 21.10.2016