Приложение аварийно завершает работу, если адрес электронной почты или пароль неверны в Firebase - PullRequest
0 голосов
/ 17 февраля 2019

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

c.call is not a function

соответствующие строки кода:

    state = { email: '', password: '', error: '', loading: false }

    userLogin = () => {
            this.setState({ loading: true });

            this.validate({
                email: { required: true, email: true },
                password: { required: true, minlength: 5 }
            });

            if (this.isFormValid()) {
                firebase.auth().signInWithEmailAndPassword(this.state.email, this.state.password)
                .then(() => Actions.partyzmain())
                .catch(setTimeout(() => {
                    this.setState({ error: 'Email or password are inccorect!', password: '', loading: false });
                }, 5000));                 
            }
            else {
                if (this.isFieldInError('password')) {
                    this.setState({ error: 'Wrong password!', password: '', loading: false });
                }
                if (this.isFieldInError('email')) {
                    this.setState({ error: 'Invalid email adress!', loading: false });
                }
            }
    };

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

большое спасибо за ответы.

1 Ответ

0 голосов
/ 17 февраля 2019

Ваш код кажется правильным.

Единственная возможная проблема может быть setTimeout, которая запускает this.setState в другом объеме, как я вижу на экране ошибок, который показывает обратный ход с таймерами.

Я рекомендуюВы должны использовать async/await и обрабатывать все метания с использованием конструкции try...catch.

Для таймеров Вы можете использовать такой метод:

const wait = (timer) => 
  new Promise((resolve) => {
    setTimeout(resolve, timer);
  })

, а общий код:

state = { email: '', password: '', error: '', loading: false }


userLogin = async () => {
  try {
        this.setState({ loading: true });

        this.validate({
            email: { required: true, email: true },
            password: { required: true, minlength: 5 }
        });

        if (!this.isFormValid()) {
            if (this.isFieldInError('password')) {
                this.setState({ 
                  error: 'Wrong password!', 
                  password: '', loading: false 
                });
            }

            if (this.isFieldInError('email')) {
                this.setState({ 
                  error: 'Invalid email address!', 
                  loading: false 
                });
            }
            return;
        }

        await firebase
                .auth()
                .signInWithEmailAndPassword(
                  this.state.email, 
                  this.state.password
                );
        Actions.partyzmain();
  }
  catch (error) {
      console.debug(error);

      if (error.code.startsWith('auth')) {
        await wait(1000);
        this.setState({ 
          error: 'Email or password are inccorect!', 
          password: '', 
          loading: false 
        });
      }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...