В настоящее время у меня есть код, который одновременно получает около пяти вызовов 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 я получаю ошибку выборки, причина: ETIMEDOUT
@esqew извините, вы не смогли меня достать. Я пытался использовать блок catch, но это не помогает, это дает мне ошибку выборки по причине: ETIMIEDOUT
Почему время ожидания истекло?
Я пишу это как ответ, чтобы предложить некоторый код, который вы можете запустить для проверки различных теорий, поскольку мы еще не знаем, в чем заключается настоящая проблема.
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
). Вы также можете указать сообществу, что это решило вашу проблему, нажав на галочку слева от ответа.
Какую ошибку вы получаете?