【问题标题】:How to handle multiple API calls如何处理多个 API 调用
【发布时间】:2020-12-24 19:39:19
【问题描述】:

我目前的代码可以同时获取大约五个 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 
              }
          )
      });
});

【问题讨论】:

  • 你得到的错误是什么?
  • 您尝试过什么来解决手头的问题?你在哪里卡住?你做了什么研究?请查看How to Ask guidelines
  • @Taplar 我得到一个获取错误原因:ETIMEDOUT
  • @esqew 很抱歉你没能找到我。我尝试过使用 catch 块,但这并没有帮助它给我一个原因的获取错误:ETIMIEDOUT
  • 为什么提取超时?

标签: javascript node.js express


【解决方案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.log(e);
        res.sendStatus(500);
    }
});

注意:这是调试问题的第一步。希望您从运行此代码中学到一些东西,然后可以将问题归零。

【讨论】:

  • @ElohoKennedy - 如果这解决了您的问题,那么您可以尝试减少 waitTime(可能降至 0)。您还可以通过单击答案左侧的复选标记向社区表明这解决了您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多