ReactJS:Axios的异步请求返回“未定义”

时间:2020-03-01 17:00:18

标签: javascript reactjs api async-await axios

我正在使用电影DB API做一个小项目,即ReactJs,我在使用异步函数时遇到了问题,我正在使项目的许多部分中的api调用在所有这些函数中都可以使用,但现在还不行工作。

我的axios配置:

export default axios.create({
  baseURL: 'https://api.themoviedb.org/3/',
  params: {
    api_key: process.env.REACT_APP_API,
  },
});

我的容器中有这个

const { setMenuSelected } = useContext(MovieContext);
const [movie, setMovie] = useState({})
const [recommendations, setRecommendations] = useState([]);
const [isLoading, setIsLoading] = useState(true)

useEffect(() => {
  animateScroll.scrollToTop({ smooth: true });
  setMenuSelected('');
  getMovieRecommendations(setRecommendations, match.params.id, setIsLoading);
  setMovie(getMovieDetails(match.params.id, setMovie));
}, [match.params.id, recommendations, isLoading]);

我正在获取其他文件中的数据只是为了组织项目

export const getMovieRecommendations = async (
  setRecommendations,
  movieId,
  setIsLoading) => {
  const res = await api.get(`/movie/${movieId}/recommendations`);
  setRecommendations(res.results);
  setIsLoading(false);
}

要渲染电影列表,我将建议传递给仅使用地图渲染每部电影的组件,

<MovieList header={'Recommentadion'} movieList={recommendations} />

但是该应用始终崩溃,提示“无法读取未定义的属性'map'”,我在chrome中查看了网络属性,并且我的请求没有任何错误。

更新:

返回console.log(JSON.stringify(res))的结果是我删除了itens的结果,因此不会太大

{
  "data":{
    "page":1,
    "results":[
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {},
      {}
    ],
    "total_pages":2,
    "total_results":40
  },
  "status":200,
  "statusText":"",
  "headers":{
    "cache-control":"public, max-age=14400",
    "content-type":"application/json;charset=utf-8",
    "etag":"W/\"56ca661f28e43dc3dd2ce41816b517c5\""
  },
  "config":{
    "transformRequest":{

    },
    "transformResponse":{

    },
    "timeout":0,
    "xsrfCookieName":"XSRF-TOKEN",
    "xsrfHeaderName":"X-XSRF-TOKEN",
    "maxContentLength":-1,
    "headers":{
      "Accept":"application/json, text/plain, */*"
    },
    "method":"get",
    "baseURL":"https://api.themoviedb.org/3/",
    "params":{
      "api_key":"fe5b485ed12153ca357c3275cfad6c5c"
    },
    "url":"https://api.themoviedb.org/3/movie/399121/recommendations"
  },
  "request":{

  }
}

3 个答案:

答案 0 :(得分:1)

尝试做:

const res = await api.get(`/movie/${movieId}/recommendations`);
console.log(JSON.stringify(res));

这会将整个JSON对象打印到控制台中的字符串中。由于未定义且没有错误,因此很可能会错误地访问JSON对象。通过打印内容,这将向您显示JSON对象的外观,以便您可以成功进入'results'属性。

答案 1 :(得分:1)

解释axios.create和示例

axios.create用于初始..(配置)

const axios = Axios.create({ withCredentials: false/true });

现在,使用axios创建一个函数,如下所示:

function get(...args) {
  return axios.get(...args)
}

并在撰写时致电:

const res = await get(`/movie/${movieId}/recommendations`);

答案 2 :(得分:1)

我认为这对您有帮助。 您应该像这样导出axios配置:

const APIClient = axios.create({
  baseURL: 'https://api.themoviedb.org/3/',
  params: {
    api_key: process.env.REACT_APP_API,
  }
});

export default APIClient;

,然后将其导入以获取另一个文件中的数据:

import  APIClient  from "YOUR AXIOS CONFIG FILE";

  export const getMovieRecommendations = async (movieId) => {
  const { data } = await APIClient.get(`/movie/${movieId}/recommendations`);
  return data;
}

在您的容器中设置以下内容:

const { setMenuSelected } = useContext(MovieContext);
const [movie, setMovie] = useState({})
const [recommendations, setRecommendations] = useState([]);
const [isLoading, setIsLoading] = useState(true)

const getList=async(movieId)=>{
const res = await getMovieRecommendations(movieId);
  setRecommendations(res.results);
  setIsLoading(false);
}

useEffect(() => {
  animateScroll.scrollToTop({ smooth: true });
  setMenuSelected('');
  getList(match.params.id);
  setMovie(getMovieDetails(match.params.id, setMovie));
}, [match.params.id, recommendations, isLoading]);