У меня есть маршрут на экспресс-сервере, который должен вызвать внешний API, который отправляет обратно список файлов на этом сервере.
После этого вы вызываете другой API-интерфейс для получения содержимого каждого файла. Как только у меня есть это, я пишу содержание
каждого файла в новый файл в корневом каталоге моего проекта.
Все нормально и хорошо работает. Проблема в том, что я делаю это с несколькими пользователями. Этот запрос занимает около 3 минут,
и если это только один экземпляр моего приложения, вызывающего маршрут, то каждый раз он работает нормально. Но если я открою другой экземпляр, войдите
с другим пользователем и запустить тот же запрос в то же время, я сталкиваюсь с проблемами.
Это не проблема тайм-аута, хотя я имел дело с этим, работая над этим, и уже нашел способы обойти это. Это определенно должно сделать
с несколькими пользователями, попадающими на маршрут одновременно.
Иногда он вообще не завершается, иногда быстро выдает ошибку обоим пользователям, а иногда только один завершается ошибкой, а другой завершается.
Я осматривался и подозреваю, что блокирую цикл обработки событий и мне нужно использовать что-то вроде рабочих потоков. Мой вопрос, я нахожусь на
правильный путь с этим или это что-то еще, что я не знаю?
Код в основном выглядит следующим образом:
//this whole request takes about 3 minutes to complete if successful due to rate limiting of the external APIs.
//it's hard to imagine why I would want to do this kind of thing, but it's not so important.. what is really important
//is why I get issues with more than 1 user hitting the route.
router.get('/api/myroute', (req, res, next) => {
//contact a remote server's API, it sends back a big list of files.
REMOTE_SERVER.file_list.list(USER_CREDS.id).then(files => {
//we need to get the contents of each specific file, so we do that here.
Promise.all(files.map((item, i) =>
//they have an API for specific files, but you need the list of those files first like we retrieved above.
REMOTE_SERVER.specific_file.get(USER_CREDS.id, {
file: { key: files[i].key }
}).then(asset => {
//write the contents of each file to a directory called "my_files" in the project root.
fs.writeFile('./my_files/' + file.key, file.value, function (err) {
if (err) {
console.log(err);
};
});
})))
.then(() => {
console.log("DONE!!");
res.status(200).send();
})
});
});