Как обрабатывать несколько вызовов API

В настоящее время у меня есть код, который одновременно получает около пяти вызовов API.

Иногда все проходит успешно, чаще всего возвращает ошибку выборки. Есть ли способ, которым я могу запускать вызовы API, чтобы они не выдавали мне ошибку?

app.post("/movie/:movieName/",function(req,res) {
    const Title = req.params.movieName
    Promise.all([
        fetch("https://api.themoviedb.org/3/movie/" + Title + "/videos?=en-us").then(Videos => Videos.json()),
        fetch("https://api.themoviedb.org/3/movie/" + Title + "?&language=en-US").then(Movies => Movies.json()),
        fetch("https://api.themoviedb.org/3/movie/" + Title + "/credits?&language=en-US").then(Cast => Cast.json()),
        fetch("https://api.themoviedb.org/3/movie/now_playing?&language=en-US&page=2").then(Playing => Playing.json()),
        fetch("https://api.themoviedb.org/3/movie/" + Title + "/similar?&language=en-US").then(Similar => Similar.json()),
    ])
      .then(function(response) {
          const Details = response[1]
          const Video = response[0].results[0]
          const Cast = response[2].cast
          const Similar = response[3].results
          const Playing = response[4].results
          res.render(
              "movie",
              { 
                  Details: Details, 
                  Video: Video, 
                  Cast: Cast, 
                  Similar: Similar, 
                  Playing: Playing 
              }
          )
      });
});

Какую ошибку вы получаете?

Taplar 24.12.2020 20:40

Что вы пытались решить проблему под рукой? Где ты застрял? Какие исследования вы провели? Пожалуйста, ознакомьтесь с руководством Как задать вопрос.

esqew 24.12.2020 20:42

@Taplar я получаю ошибку выборки, причина: ETIMEDOUT

Eloho Kennedy 24.12.2020 20:42

@esqew извините, вы не смогли меня достать. Я пытался использовать блок catch, но это не помогает, это дает мне ошибку выборки по причине: ETIMIEDOUT

Eloho Kennedy 24.12.2020 20:53

Почему время ожидания истекло?

Wyck 24.12.2020 21:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
651
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пишу это как ответ, чтобы предложить некоторый код, который вы можете запустить для проверки различных теорий, поскольку мы еще не знаем, в чем заключается настоящая проблема.

ETIMEDOUT на самом деле не говорит нам, почему вы получаете ошибку.

Если это крупный сайт, маловероятно, что сервер просто недостаточно производительен и на самом деле истекает время ожидания. Возможно, он недоволен тем, что вы отправляете ему сразу 5 быстрых запросов, но на самом деле он должен выдавать вам другую ошибку.

Также возможно, есть какая-то проблема с вашим сетевым соединением между вами и этим API-сервером.

Чтобы исключить проблему быстрых запросов, вы можете отправить свой запрос последовательно с небольшой задержкой между ними и посмотреть, изменит ли это проблему вообще.

app.post("/movie/:movieName/", async function(req, res) {
    try {
        const Title = req.params.movieName;

        function fetchCommon(suffix) {
            return fetch("https://api.themoviedb.org/3/movie/" + suffix).then(r => r.json());
        }

        function delay(t) {
            return new Promise(resolve => {
                setTimeout(resolve, t);
            });
        }

        const input = [
            Title + "/videos?=en-us",
            Title + "?&language=en-US",
            Title + "?&language=en-US",
            "now_playing?&language=en-US&page=2",
            Title + "/similar?&language=en-US"
        ];
        const results = [];
        const waitTime = 250;

        for (arg of input) {
            let result = await fetchCommon(arg);
            results.push(result);
            await delay(waitTime);
        }
        const Details = response[1];
        const Video = response[0].results[0];
        const Cast = response[2].cast;
        const Similar = response[3].results;
        const Playing = response[4].results;
        res.render(
            "movie", {
                Details,
                Video,
                Cast,
                Similar,
                Playing
            }
        );
    } catch (e) {
        // always send a response, even if there's an error
        console.info(e);
        res.sendStatus(500);
    }
});

Примечание. Это шаг №1 устранения проблемы. Мы надеемся, что вы чему-то научитесь, запустив этот код, и сможете сосредоточиться на фактической основной причине проблемы.

@ElohoKennedy - Если это решило вашу проблему, вы можете поэкспериментировать с уменьшением waitTime (возможно, до 0). Вы также можете указать сообществу, что это решило вашу проблему, нажав на галочку слева от ответа.

jfriend00 25.12.2020 16:29

Другие вопросы по теме