Reputation: 462
I try to receive the user data in the login screen after a user is logging into account. Login into account is all working fine, but is not showing any data from user. I search for this type of error and I tried to change some stuff in my code, even adding mongoose.Types.ObjectId("user id")
but don't work.
Here is my user Model:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
email: {
type: String,
required: true,
},
passwordHash: {
type: String,
required: true,
},
phone: {
type: String,
required: true,
},
isAdmin: {
type: Boolean,
default: false,
},
street: {
type: String,
default: ''
},
apartment: {
type: String,
default: ''
},
zip :{
type: String,
default: ''
},
city: {
type: String,
default: ''
},
country: {
type: String,
default: ''
}
});
userSchema.virtual('id').get(function () {
return this._id.toHexString();
});
userSchema.set('toJSON', {
virtuals: true,
});
exports.User = mongoose.model('User', userSchema);
exports.userSchema = userSchema;
Here is the auth actions.js part of script that I use to call my POST AND GET methods from backend:
export const loginUser = (user, dispatch) => {
fetch(`${baseURL}users/login`, {
method: "POST",
body: JSON.stringify(user),
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
})
.then((res) => res.json())
.then((data) => {
if (data) {
const token = data.token;
AsyncStorage.setItem("jwt", token)
const decoded = jwt_decode(token)
dispatch(setCurrentUser(decoded, user))
} else {
logoutUser(dispatch)
}
})
.catch((err) => {
Toast.show({
topOffset: 60,
type: "error",
text1: "Please provide correct credentials",
text2: ""
});
logoutUser(dispatch)
});
};
export const getUserProfile = (id) => {
fetch(`${baseURL}users/${id}`, {
method: "GET",
body: JSON.stringify(user),
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
})
.then((res) => res.json())
.then((data) => console.log(data));
}
And here is the routing for user, for GET method:
router.get(`/`, async (req, res) =>{
const userList = await User.find().select('-passwordHash');
if(!userList) {
res.status(500).json({success: false})
}
res.send(userList);
})
router.get('/:id', async(req,res)=>{
const user = await User.findById(req.params.id).select('-passwordHash');
if(!user) {
res.status(500).json({message: 'The user with the given ID was not found.'})
}
res.status(200).send(user);
})
Here is the screen that I want to fill:
import React, {useContext, useState, useCallback} from 'react';
import { View, Text, ScrollView, Button, StyleSheet } from 'react-native';
import { Container } from 'native-base'
import { useFocusEffect } from "@react-navigation/native"
import AsyncStorage from "@react-native-community/async-storage"
import axios from "axios"
import baseURL from "../../assets/common/baseUrl"
import AuthGlobal from "../../Context/store/AuthGlobal"
import { logoutUser } from "../../Context/actions/Auth.actions"
import { useEffect } from 'react/cjs/react.development';
const UserProfile = (props) => {
const context = useContext(AuthGlobal)
const [userProfile, setUserProfile] = useState()
useEffect(() => {
if(
context.stateUser.isAuthenticated === false ||
context.stateUser.isAuthenticated === null
) {
props.navigation.navigate("Login")
}
AsyncStorage.getItem("jwt")
.then((res) => {
axios
.get(`${baseURL}users/${context.stateUser.user.sub}`, {
headers: { Authorization: `Bearar ${res}` },
})
.then((user) => setUserProfile(user.data))
})
.catch((error) => console.log(error))
return () => {
setUserProfile();
}
}, [context.stateUser.isAuthenticated])
return(
<Container>
<ScrollView>
<Text style={{ fontSize: 30}}>
{userProfile ? userProfile.name : ""}
</Text>
<View style={{marginTop: 20}}>
<Text style={{margin: 10}}>
Email: {userProfile ? userProfile.email : ""}
</Text>
<Text style={{margin: 10}}>
Phone: {userProfile ? userProfile.phone : ""}
</Text>
</View>
<View style={{ marginTop: 80 }}>
<Button title={"Sign Out"} onPress={() => [
AsyncStorage.removeItem("jwt"),
logoutUser(context.dispatch)
]}/>
</View>
</ScrollView>
</Container>
)
}
export default UserProfile;
Here is the ss with my user screen:
Upvotes: 0
Views: 1762
Reputation: 462
I solved it some time ago but I forgot to post the answer. The problem was when I try to parse the parameter for my user ID. So I made another variable and I saved the old "sub" variable that contain ID of user in a now variable "userID", and i this way working fine.
Here is the new UserProfile.js script:
import React, {useContext, useState, useEffect, useCallback} from 'react';
import { View, Text, ScrollView, Button, StyleSheet } from 'react-native';
import { Container } from 'native-base'
import { useFocusEffect } from "@react-navigation/native"
import AsyncStorage from "@react-native-community/async-storage"
import OrderCard from "../../Shared/OrderCard"
import axios from "axios"
import baseURL from "../../assets/common/baseUrl"
import AuthGlobal from "../../Context/store/AuthGlobal"
import { logoutUser } from "../../Context/actions/Auth.actions"
//import { useEffect } from 'react/cjs/react.development';
const UserProfile = (props) => {
const context = useContext(AuthGlobal);
const [userProfile, setUserProfile] = useState();
const [orders, setOrders] = useState();
useFocusEffect(
useCallback(() => {
if(
context.stateUser.isAuthenticated === false ||
context.stateUser.isAuthenticated === null
) {
props.navigation.navigate("Login")
}
AsyncStorage.getItem("jwt")
.then((res) => {
axios
.get(`${baseURL}users/${context.stateUser.user.userId}`, {
headers: { Authorization: `Bearer ${res}` },
})
.then((user) => setUserProfile(user.data))
})
.catch((error) => console.log(error))
axios
.get(`${baseURL}orders`)
.then((x) => {
const data = x.data;
console.log(data)
const userOrders = data.filter(
(order) => order.user._id === context.stateUser.user.userId
);
setOrders(userOrders);
})
.catch((error) => console.log(error))
return () => {
setUserProfile();
setOrders();
}
}, [context.stateUser.isAuthenticated]))
return(
<Container style={styles.container}>
<ScrollView contentContainerStyle={styles.subContainer}>
<Text style={{ fontSize: 30}}>
{userProfile ? userProfile.name : ""}
</Text>
<View style={{marginTop: 20}}>
<Text style={{margin: 10}}>
Email: {userProfile ? userProfile.email : ""}
</Text>
<Text style={{margin: 10}}>
Phone: {userProfile ? userProfile.phone : ""}
</Text>
</View>
<View style={{ marginTop: 80 }}>
<Button title={"Sign Out"} onPress={() => [
AsyncStorage.removeItem("jwt"),
logoutUser(context.dispatch)
]}/>
</View>
<View style={styles.order}>
<Text style={{ fontSize: 20 }}>My Orders</Text>
<View>
{orders ? (
orders.map((x) => {
return <OrderCard key={x.id} {...x} />;
})
) : (
<View style={styles.order}>
<Text>You have no orders</Text>
</View>
)}
</View>
</View>
</ScrollView>
</Container>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: "center"
},
subContainer: {
alignItems: "center",
marginTop: 60
},
order: {
marginTop: 20,
alignItems: "center",
marginBottom: 60
}
})
export default UserProfile;
Upvotes: 0