getState() 在 React Native 中有时会返回 idToken 而不是 localId 作为 userID

问题描述

我从 getState() 获取 idToken 作为 userId 而不是 localId。而且,有时我会在我的 userId 中获取 localId。我不知道是什么导致了我的应用出现这个问题。

当我从 redux 状态(localId)获得正确的 userId 时,我就可以在我的管理区域中看到我的产品。

操作/Product.js:

import Product from "../../models/Product";

export const DELETE_PRODUCT = "DELETE_PRODUCT";
export const CREATE_PRODUCT = "CREATE_PRODUCT";
export const UPDATE_PRODUCT = "UPDATE_PRODUCT";
export const SET_PRODUCT = "SET_PRODUCT";

export const fetchProducts = () => {
  return async (dispatch,getState) => {
    console.log(getState());
    const userId = getState().Auth.userId;
    try {
      const response = await fetch(
        "https://shopping-app-62e38-default-rtdb.firebaseio.com/products.json"
      );

      if (!response.ok) {
        throw new Error("Something went wrong!");
      }

      const resData = await response.json();
      const loadedProducts = [];

      for (const key in resData) {
        loadedProducts.push(
          new Product(
            key,resData[key].ownerId,resData[key].title,resData[key].imageUrl,resData[key].description,resData[key].price
          )
        );
      }
      dispatch({
        type: SET_PRODUCT,products: loadedProducts,userProducts: loadedProducts.filter((prod) => prod.ownerId === userId),});
    } catch (error) {
      throw error;
    }
  };
};

export const deleteProduct = (productId) => {
  return async (dispatch,getState) => {
    const token = getState().Auth.token;
    const response = await fetch(
      `https://shopping-app-62e38-default-rtdb.firebaseio.com/products/${productId}.json?auth=${token}`,{
        method: "DELETE",}
    );

    if (!response.ok) {
      throw new Error("Something went wrong!");
    }

    dispatch({ type: DELETE_PRODUCT,pid: productId });
  };
};

export const createProduct = (title,description,imageUrl,price) => {
  return async (dispatch,getState) => {
    const token = getState().Auth.token;
    const userId = getState().Auth.userId;
    console.log(getState());
    const response = await fetch(
      `https://shopping-app-62e38-default-rtdb.firebaseio.com/products.json?auth=${token}`,{
        method: "POST",headers: {
          "Content-Type": "application/json",},body: JSON.stringify({
          title,price,ownerId: userId,}),}
    );
    const resData = await response.json();
    console.log(userId);

    dispatch({
      type: CREATE_PRODUCT,productData: {
        id: resData.name,title,});
  };
};

export const updateProduct = (id,imageUrl) => {
  return async (dispatch,getState) => {
    const token = getState().Auth.token;
    const response = await fetch(
      `https://shopping-app-62e38-default-rtdb.firebaseio.com/products/${id}.json?auth=${token}`,{
        method: "PATCH",}
    );

    if (!response.ok) {
      throw new Error("Something went wrong!");
    }

    dispatch({
      type: UPDATE_PRODUCT,pid: id,productData: { title,imageUrl },});
  };
};

动作/Auth.js:

import { AsyncStorage } from "react-native";

let timer;

export const AUTHENTICATE = "AUTHENTICATE";
export const logoUT = "logoUT";

export const Authenticate = (userId,token,expiryTime) => {
  return (dispatch) => {
    dispatch(setlogoutTimer(expiryTime));
    dispatch({ type: AUTHENTICATE,userId: userId,token: token });
  };
};

export const signup = (email,password) => {
  return async (dispatch) => {
    const response = await fetch(
      "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=AIzaSyAnaJyjjGppk9-FiWocva_cP0vaMrKp4_4",body: JSON.stringify({
          email: email,password: password,returnSecuretoken: true,}
    );
    if (!response.ok) {
      const responseData = await response.json();
      const errorMessage = responseData.error.message;
      if (errorMessage === "EMAIL_EXISTS") {
        throw new Error("Email already exists");
      }
    }
    const resData = await response.json();
    console.log(resData);
    dispatch(
      Authenticate(
        resData.idToken,resData.localId,parseInt(resData.expiresIn) * 1000
      )
    );
    const expirationDate = new Date(
      new Date().getTime() + parseInt(resData.expiresIn) * 1000
    );
    saveDataToStorage(resData.idToken,expirationDate);
  };
};

export const login = (email,password) => {
  return async (dispatch) => {
    const response = await fetch(
      "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyAnaJyjjGppk9-FiWocva_cP0vaMrKp4_4",}
    );
    if (!response.ok) {
      const responseData = await response.json();
      const errorMessage = responseData.error.message;
      if (
        errorMessage === "EMAIL_NOT_FOUND" ||
        errorMessage === "INVALID_PASSWORD"
      ) {
        throw new Error("Email or Password is wrong!!");
      }
    }
    const resData = await response.json();
    console.log(resData);
    dispatch(
      Authenticate(
        resData.idToken,parseInt(resData.expiresIn) * 1000
      )
    );
    const expirtationDate = new Date(
      new Date().getTime() + parseInt(resData.expiresIn) * 1000
    );
    saveDataToStorage(resData.idToken,expirtationDate);
  };
};

export const logout = () => {
  clearlogoutTimer();
  AsyncStorage.removeItem("userData");
  return { type: logoUT };
};

const clearlogoutTimer = () => {
  if (timer) {
    clearTimeout(timer);
  }
};

const setlogoutTimer = (expirationTime) => {
  return (dispatch) => {
    timer = setTimeout(() => {
      dispatch(logout());
    },expirationTime);
  };
};

const saveDataToStorage = (token,userId,expirtationDate) => {
  AsyncStorage.setItem(
    "userData",JSON.stringify({
      token: token,expiryDate: expirtationDate.toISOString(),})
  );
};

如何解决这个问题?有没有其他方法可以将 localId 作为 userId 或任何其他方法来做同样的事情?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)