Как одновременно вызвать две разные конечные точки API REST и отобразить данные с обеих сторон на одной конечной точке моего приложения? - PullRequest
0 голосов
/ 24 января 2019

Я создаю простое приложение для своего портфолио, используя База данных фильмов API.В моем маршруте GET / movie я хочу получить и отобразить данные о фильме, а также имена и фотографии участников ролей, однако данные для фильма и данные для участников ролей принадлежат двум отдельным конечным точкам API,и я в полной растерянности относительно того, как получить доступ к обоим наборам данных ответов под одной конечной точкой в ​​моем приложении.

Я не могу вызвать axios.get () на обеих конечных точках по маршруту / movie, потому что получаю ошибку «Заголовки уже отправлены», и я попытался написать функцию, которая использует axios.get для 1 конечной точкиэто возвращает ответ и вызывается в моем маршруте GET / фильма, но это заставляет весь маршрут GET возвращать неопределенный.

Вот мой текущий код для моего маршрута / фильма, который является неправильным, но близко передает то, что яя пытаюсь выполнить

const express = require('express');
const router = express.Router();
const axios = require('axios');
const api_key = require('../config/keys').api_key;
const imgURL = "http://image.tmdb.org/t/p/";
const dateFormat = require('../config/dateFormat');

getActors = movie_id => {
    axios.get(`https://api.themoviedb.org/3/movie/${movie_id}/credits?api_key=${api_key}&language=en-US`)
        .then(res => { 
            return res.data;
         }).catch(err => console.log(err.message));
}

router.get('/:id', (req, res) => {
    const id = req.params.id
    axios.get(`https://api.themoviedb.org/3/movie/${id}?api_key=${api_key}&language=en-US`)
        .then(res => {
            const movieData = res.data;
            const actors = getActors(id); //calling above function here, but returns undefined and hangs the application
            res.render('movie', {movieInfo: movieData, imgURL: imgURL, releaseDate: dateFormat(movieData.release_date), actors: actors})
        })
        .catch(err => console.log(err.status_message))
});

module.exports = router;

любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы можете использовать axios.all для объединения нескольких обещаний и их параллельного выполнения.Затем, как только все добавленные запросы будут завершены, вы можете обработать их, а затем пообещать результат их выполнения.Например, в вашем коде:

const express = require('express');
const router = express.Router();
const axios = require('axios');
const api_key = require('../config/keys').api_key;
const imgURL = "http://image.tmdb.org/t/p/";
const dateFormat = require('../config/dateFormat');

axios.all([
    axios.get(`https://api.themoviedb.org/3/movie/${movie_id}/credits?api_key=${api_key}&language=en-US`),
    axios.get(`https://api.themoviedb.org/3/movie/${id}?api_key=${api_key}&language=en-US`)
  ])
  .then(axios.spread((actorsRes, moviesRes) => {
    // Your logic with each response
  });

module.exports = router;
0 голосов
/ 24 января 2019

Я вижу, что getActors в настоящее время возвращает null. Измените его на ...

const getActors = movie_id => {
    return axios.get(`https://api.themoviedb.org/3/movie/${movie_id}/credits?api_key=${api_key}&language=en-US`)
        .then(res => { 
            return res.data;
         }).catch(err => console.log(err.message));
}

Другая проблема - вызов функции getActors. Эта функция содержит асинхронную функцию axios.get(). Измени это на ..

router.get('/:id', (req, res) => {
    let movieData;
    const id = req.params.id
    axios.get(`https://api.themoviedb.org/3/movie/${id}?api_key=${api_key}&language=en-US`)
        .then(res => {
            movieData = res.data;
            return getActors(id);

        })
        .then(actors => {
            res.render('movie', {movieInfo: movieData, imgURL: imgURL, releaseDate: dateFormat(movieData.release_date), actors: actors})
        })
        .catch(err => console.log(err.status_message))
});
...