My issue is from route getting the response in json format. And when consoling it gives the data as well but when i passing in setProfileData(data) then updated state gives undefined.
But when i gives like setProfileData(data.user.name) then its gives that specific value.
Here my server route
router.get('/user/:id',async(req,res)=>{
try {
const user = await User.findOne({_id:req.params.id}).select('-password')
const post = await Post.find({postedBy:req.params.id}).populate('postedBy', '_id name')
return res.json({user,post})
} catch (error) {
return res.json(error)
}
})
Here is my Component UserProfile
import React,{useContext,useEffect,useState} from 'react';
import {useHistory,useParams} from 'react-router-dom'
import {UserContext} from '../../App'
const UserProfile = ()=>{
const [newProfile,setProfileData] = useState(null)
const {state,dispatch} = useContext(UserContext)
const {userId} = useParams()
console.log(userId)
useEffect(()=>{
fetch(`/user/${userId}`,{
headers:{
'Authorization': 'Bearer '+localStorage.getItem('jwt')
}
}).then((res)=>{
return res.json()
}).then((data)=>{
console.log(data)
setProfileData(data)
})
},[])
return (
<div style={{width:'555px',margin:"0px auto"}}>
<div style={{display:"flex",justifyContent:"space-around",margin:'18px 0px',borderBottom:"1px solid grey"}}>
<div><img style={{width:"160px",height:"160px",borderRadius:"80px"}}
src="https://images.unsplash.com/photo-1550927407-50e2bd128b81?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60" alt="Profile Pic"/>
</div>
<div>
<h4>{newProfile.user.name}</h4>
<div style={{display:"flex",justifyContent:"space-around",width:"108%"}}>
<h5>40 Posts</h5>
<h5>40 Followers</h5>
<h5>40 Followings</h5>
</div>
</div>
</div>
<div className="gallery">
{
// userProfile.map((item)=>{
// return (
// <img key={item._id} className="item" src={item.file} alt={item.title}/>
// )
// })
}
</div>
</div>
);
}
export default UserProfile;
{newProfile.user.name} giving type undefined
useStateis the initial value fornewProfile, which isnullhere. So, in the first render, the value ofnewProfileis equal tonull. You need to check for data and show a loading indicator whennewProfileisnull.