strmr
strmr

Reputation: 3

Unhandled Rejection (TypeError): Cannot read property 'map' of undefined

I get the object from developers.themoviedb.org, but really dissapoint what wrong.
The object is sent to the browser, but I do not understand how to throw it to me.
I'm confused, need help
If in middleware i write let arr = JSON.parse(response).results; also an error:

Unexpected token o in JSON at position 1

response with object in browser

data.service.js

export const getData = (url) => new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open('GET', url);
request.onload = () =>
    (request.status === 200) ?
        resolve(JSON.parse(request.response).results) :
        reject(Error(request.statusText))
  request.onerror = (err) => reject(err)
  request.send();
});

movies.middleware.js

export const moviesMiddleware = store => next => action => {
if (action.type === FETCH_MOVIES_START) {
    getData(popularMovies).then((response) => {
        let arr = response.results;
        let movies = arr.map((item) => {
           return new MovieEntity(item);
        });
        let data = movies;
        store.dispatch({
            type: FETCH_MOVIES_SUCCESS,
            payload: data
        });
    });
  }
  return next(action);
}

movies.action.js

export function fetchMovies() {
return {
    type: FETCH_MOVIES_START
 }
}

Upvotes: 0

Views: 1145

Answers (1)

Neha Tawar
Neha Tawar

Reputation: 705

Your data is already an object. No need to parse it. And every time before parsing check the typeOf the param is string or not. ------EDIT-----

Also Try:

  resolve(
   if(typeOf(request.response)=='string')
    JSON.parse(request.response).results 
   else request.response.results
   )

in movies.middleware.js change as below

export const moviesMiddleware = store => next => action => {
if (action.type === FETCH_MOVIES_START) {
    getData(popularMovies).then((response) => {
        let arr = response;
        let movies = arr.map((item) => {
           return new MovieEntity(item);
        });
        let data = movies;
        store.dispatch({
            type: FETCH_MOVIES_SUCCESS,
            payload: data
        });
    });
  }
  return next(action);
}

The thing is you are resolving promise with request.response.results and again in then you have accessed it the same way response.result either return request.response or change accessing as above response .

Upvotes: 1

Related Questions