我正在使用电影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":{
}
}
答案 0 :(得分:1)
尝试做:
const res = await api.get(`/movie/${movieId}/recommendations`);
console.log(JSON.stringify(res));
这会将整个JSON对象打印到控制台中的字符串中。由于未定义且没有错误,因此很可能会错误地访问JSON对象。通过打印内容,这将向您显示JSON对象的外观,以便您可以成功进入'results'属性。
答案 1 :(得分:1)
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]);