Jestem dość nowy, aby zareagować rodzimy i próbuję nadejść moją pierwszą aplikację RN / Expo, jednak stanęł przed problemem, który utknął.

Używałem API Fetch, aby wywoływać wezwania do FireBase Auth i DB, ale musiałem przenieść do FireBase SDK (JS / Web), ponieważ musiałem korzystać z pamięci Firebase, zapewnia obrazy. Konwertowałem wszystko i działa dobrze z wyjątkiem części obsługi błędów.

Tutaj poniżej mam mój authscreen.js , gdzie wykonuję funkcję do logowania lub zarejestrować użytkownika,

const [error, setError] = useState(null);

useEffect(() => {
    console.log('Entered useEffect');
    if (error) {
      Alert.alert('Error Occured', error, [{ text: 'Close' }]);
    }
  }, [error]);

  const authHandler = async () => {
    let action;

    if (isLogin) {
      action = authActions.login(email, password);
    } else {
      action = authActions.signup(email, password, name);
    }
    setError(null);
    setIsLoading(true);
    try {
      await dispatch(action);
    } catch (err) {
      console.log('Error', err);
      setError(err.message);
      setIsLoading(false);
    }
  };

<Button
  size='small'
  style={styles.button}
  status='basic'
  onPress={authHandler}
  icon={isLoading ? () => <ActivityIndicator /> : null}
>
   {isLoading ? null : 'PROCEED'}
</Button>

To jest akcja w moim sklepie Redux,

export const login = (email, pw) => {
  return async dispatch => {
    firebase
      .auth()
      .signInWithEmailAndPassword(email, pw)
      .then(() => {
        const userId = firebase.auth().currentUser.uid;
        firebase
          .database()
          .ref('/users/' + userId)
          .once('value')
          .then(snapshot => {
            const data = snapshot.val();
            console.log('data', data);
            dispatch({ type: REMOVE_USER });
            dispatch({ type: GET_USER, user: data.name });
          })
          .catch(err => console.log('err.message', err.message));
      })
      .catch(err => {
        let message = 'An error has occured!';

        if (err.code === 'auth/invalid-email') {
          message = 'Invalid email address!';
        } else if (err.code === 'auth/user-not-found') {
          message = 'No account with such credentials!';
        } else if (err.code === 'auth/wrong-password') {
          message = 'Incorrect password! Try again.';
        }

        throw new Error(message);
      });
  };
};

Kiedy próbuję ponownie wprowadzić błąd, wystarczy błąd pojawić się w ten sposób,

Error

To powinno być alert. Nie mogę tego zrozumieć ..

0
domster 19 marzec 2020, 16:50

1 odpowiedź

Najlepsza odpowiedź

Znalazłem rozwiązanie!

Dodawanie czeka rozwiązałaby problem. Każda wysyłka asynchroniczna byłaby wymagała czekać .

export const login = (email, pw) => {
return async dispatch => {
    await firebase
      .auth()
      .signInWithEmailAndPassword(email, pw)
      .then(() => {
        const userId = firebase.auth().currentUser.uid;
        firebase
          .database()
          .ref('/users/' + userId)
          .once('value')
          .then(snapshot => {
            const data = snapshot.val();
            dispatch({ type: REMOVE_USER });
            dispatch({ type: GET_USER, user: data.name });
          })
          .catch(err => console.log('err.message', err.message));
      })
      .catch(err => {
        let message = 'An error has occured!';

    if (err.code === 'auth/invalid-email') {
      message = 'Invalid email address!';
    } else if (err.code === 'auth/user-not-found') {
      message = 'No account with such credentials!';
    } else if (err.code === 'auth/wrong-password') {
      message = 'Incorrect password! Try again.';
    }

    throw new Error(message);
  });
  };
};
0
domster 21 marzec 2020, 03:25