问题描述
我从 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 (将#修改为@)