Javascript ReactJS:Axios';异步请求正在返回';未定义';

Javascript ReactJS:Axios';异步请求正在返回';未定义';,javascript,reactjs,api,async-await,axios,Javascript,Reactjs,Api,Async Await,Axios,我正在使用电影DB API is ReactJs做一个小项目,我在使用异步函数时遇到了问题,我在项目的许多部分进行了API调用,所有的部分都成功了,但现在它不起作用了 我的axios配置: export default axios.create({ baseURL: 'https://api.themoviedb.org/3/', params: { api_key: process.env.REACT_APP_API, }, }); 我的容器里有这个 const { se

我正在使用电影DB API is 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);
}
为了渲染电影列表,我将建议传递给只使用map渲染每部电影的组件

<MovieList header={'Recommentadion'} movieList={recommendations} />
试着做:

const res = await api.get(`/movie/${movieId}/recommendations`);
console.log(JSON.stringify(res));
这将在控制台中将整个JSON对象打印成字符串。由于未定义且没有错误,因此很可能无法正确访问JSON对象。通过打印内容,这将向您显示JSON对象的外观,以便您可以成功访问“results”属性。

Explain axios.create&Example axios.create用于初始。。(配置)

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

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

function get(...args) {
  return axios.get(...args)
}
写的时候打电话:

const res = await get(`/movie/${movieId}/recommendations`);
我想这对你有帮助。 您应该像这样导出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]);

你能给我们看一下你的电影列表组件吗?这实际上与axios有关。您必须获取res.data.results,而不是res.results。调试并查看您是否真的获得了该属性。并尝试检查res.data而不是res.results。是否错过了此
等待api。获取
?我猜你的意思是<代码>等待AXIOS。GET(…..)/代码> @ HavalChHeDA这是真的,谢谢。我想我会这样做,这样我不需要把函数传递给其他人。你确信“结果”是否在API的返回数据中?考虑AXIOS总是返回一个“数据”参数。你能用返回的JSON更新这个问题吗?我怀疑您只是错误地访问了“.results”属性。
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]);