为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理多个API调用

如何处理多个API调用

饮歌长啸 2024-01-18 20:31:55
我目前的代码可以同时获取大约五个 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               }          )      });});
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

我写这篇文章作为答案只是为了我可以提出一些代码,您可以运行这些代码来测试各种理论,因为我们还不知道实际问题是什么。


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);

    }

});

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


查看完整回答
反对 回复 2024-01-18
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信