MongoDB Stitch связал CustomData, потерянный после обновления страницы - PullRequest
0 голосов
/ 29 января 2020

Я использую React с MongoDB и MongoDB Stitch без серверного сервера в качестве службы. Я сделал Google Login, для которого я следовал учебнику по учебникам MongoDB.

https://docs.mongodb.com/stitch/tutorials/guides/todo-guide-google/

Потому что я хочу, чтобы пользователи также предоставляли дополнительные данные. Я создал пользовательскую вкладку «Данные» с именем users, которую я связал с полем owner_id для пользователя, который входит в систему. Я проследовал за документами, и это работает нормально.

Настройка пользовательских данных

Когда пользователь входит в свойство объекта currentuser с именем customData, содержит дополнительные данные. Однако, как только происходит обновление страницы sh, все данные текущего пользователя все еще доступны, за исключением того, что объект customData пуст.

Можно ли сохранить customData также доступным для currentUser. Или MongoDB Stitch предоставляет customData пользователя только один раз после входа в систему?

export const StitchAuthProvider = ({ children }) => {
  const [authState, setAuthState] = useState({
    isLoggedIn: hasLoggedInUser(),
    currentUser: getCurrentUser()
  });

  useEffect(() => {
    const authListener = {
      onUserLoggedIn: (auth, loggedInUser) => {
        if (loggedInUser) {
          setAuthState(authState => ({
            ...authState,
            isLoggedIn: true,
            currentUser: loggedInUser
          }));
          if (!loggedInUser.customData._id) {
            try {
              users.insertOne({
                owner_id: loggedInUser.id,
                ...loggedInUser.profile.data
              });
            } catch (error) {
              console.error("aaaaah Ik messed up!", error);
            }
          }
        }
      },
      onUserLoggedOut: (auth, loggedOutUser) => {
        setAuthState(authState => ({
          ...authState,
          isLoggedIn: false,
          currentUser: null
        }));
      }
    };
    addAuthenticationListener(authListener);
    handleOAuthRedirects();
    setAuthState(state => ({ ...state }));
    return () => {
      removeAuthenticationListener(authListener);
    };

    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  // Authentication Actions
  const handleLogin = async provider => {
    if (!authState.isLoggedIn) {
      switch (provider) {
        case "anonymous":
          return loginAnonymous();
        case "google":
          return loginGoogle();
        default: {
        }
      }
    }
  };

  const handleLogout = async () => {
    const { isLoggedIn } = authState;
    if (isLoggedIn) {
      await logoutCurrentUser();
      setAuthState({
        ...authState,
        isLoggedIn: false,
        currentUser: null
      });
    } else {
      console.log(`can't handleLogout when no user is logged in`);
    }
  };

  const authInfo = useMemo(
    () => {
      const { isLoggedIn, currentUser } = authState;
      // TODO: remove logger
      console.log(currentUser);
      const value = {
        isLoggedIn,
        currentUser,
        actions: { handleLogin, handleLogout }
      };
      return value;
    },
    // eslint-disable-next-line react-hooks/exhaustive-deps
    [authState.isLoggedIn]
  );

...