Как ждать объект аутентификации с крючками? (MongoDB Stitch в React Native) - PullRequest
1 голос
/ 14 января 2020

Я использую React Native для создания приложения, которое использует MongoDB Stitch для аутентификации. Чаще всего приложение вылетает из-за того, что объект client еще не загружен, когда я использую его в следующей строке кода. Ошибка, которую я получаю, является печально известной TypeError: undefined не является объектом , за которым следует оценка 'client.auth.user' .

import React from 'react';
import { View, Text } from 'react-native';
import { Stitch } from 'mongodb-stitch-react-native-sdk';

const APP_ID = '<my app ID>';

const client = Stitch.hasAppClient(APP_ID)
    ? Stitch.getAppClient(APP_ID)
    : Stitch.initializeDefaultAppClient(APP_ID);

const { user } = client.auth;

const Home = () => {
    return (
        <View style={styles.home}>
            <Text>HOME</Text>
            <Text>Hi {user.profile.data.email}</Text>
        </View>
    );
};

export default Home;

const styles = {
    home: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center'
    }
};

В примере с пакет MongoDB Stitch NPM использует componentDidMount (см. здесь ), но я пытаюсь сделать это с помощью хуков. Я пробовал useEffect , набор if операторов, async / await , перевод объекта в состояние с помощью useState ; Не повезло.

1 Ответ

0 голосов
/ 14 января 2020

Так что да, вы можете использовать ловушку useEffect для создания экземпляра клиента и получения информации о пользователе.

  useEffect(() => {
    _loadClient();
   }, []);

const [client,setClient] = useState({});
const [user,setUser] = useState({});

_loadClient() {
Stitch.initializeDefaultAppClient('<your-client-app-id>').then(client => {
 setClient(client);

  if(client.auth.isLoggedIn) {
    setUser( client.auth.user)
  }
});

}

Это должно сделать это.

...