I'm making an API call in via axios
in React
with a UseEffect
.
We set the response to a variable called data
using useState
const [data, setData] = useState({});
setData(response);
The response is from NASA API and we only get one object (pasted below) returned for this call.
Since I named the response "data" and it has a "data" key as well, if I want to log the url, I know I would type console.log(data.data.url)
and that works smoothly in my app.js
main function. In my card.js
component, I can successfully log console.log(data)
and console.log(data.data)
and it gives exactly what you would expect, but when I console.log(data.data.url)
or (data.data.title)
it becomes for some reason undefined
, so then this results in a big error in the return function of JSX and the site won't load:
TypeError: Cannot read property 'data' of undefined error.
I don't think I'm doing anything wrong with my naming as it works fine at higher levels in the object e.g. console.log(data.data)
works and I see before my eyes the next level properties listed.
I am literally console.logging this:
{console.log('FROM INSIDE THE RETURN')}
{console.log(props.data)} // works, displays object {}
{console.log(props.data.data)} //works, displays object one level lower
{console.log(props.data.data.url)} // type error. You name the property.
Needless to say this doesn't work, which was my first approach to the assignment:
<img src={props.data.data.url}/>
That said we got the program working with help of the team lead by shaving off the top layer of the object upstream as follows:
SetData(response.data)
// as opposed to
SetData(response)
// and then using
<img src={props.data.url}/>
So we didn't have to reach to the bottom in the props, but for clarity, I want to know why and what difference it makes to the compiler, particularly when it worked fine up to n-1 layers, where n is the number of layers of the object.
I even changed the name of one of the data variables so 'data' wasn't duplicated and the behavior was the same.
Thank you for your help and insights! I really appreciate any insights you can share as well as feedback on my question.
Here is the object I'm working with.
{
data: {
copyright: "Bryan Goff",
date: "2020-03-18",
explanation: "What's happening behind...[truncated]...Florida, USA.",
hdurl: "https://apod.nasa.gov/apod/image/2003/AntiCrepRays_Goff_3072.jpg",
media_type: "image",
service_version: "v1",
title: "Anticrepuscular Rays over Florida",
url: "https://apod.nasa.gov/apod/image/2003/AntiCrepRays_Goff_960.jpg"
},
status: 200,
statusText: "OK",
headers: {
contenttype: "application/json"
},
config: {
url: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY",
method: "get",
headers: {
Accept: "application/json, text/plain, */*"
},
transformRequest: [
null
],
transformResponse: [
null
],
timeout: 0,
xsrfCookieName: "XSRF-TOKEN",
xsrfHeaderName: "X-XSRF-TOKEN",
maxContentLength: -1
},
request: {}
}