Я здесь немного застыл.
Я создаю экспресс-приложение, которое должно экспортировать огромное количество данных из магазина Shopify с помощью одного запроса.
Проблема заключается в том, что когда я достигаю отметки 2 минуты, запрос снова запускается (так как время ожидания по умолчанию равно 2 минутам), поэтому я увеличил значение server.setTimeout()
, чтобы учесть необходимое ему время.
Так что это исправило запрос на отметке 2 минуты, но как только мой запрос закончился, еще раз по какой-то причине был сделан второй запрос.
Вот пример голой проблемы:
const express = require('express');
function sleep(ms){
return new Promise(resolve=>{
setTimeout(resolve,ms)
})
}
app.get('/export', async (req, res) => {
// Sleep for 2:03min
await sleep(123000);
console.log('Starting request');
res.status(200).send('Finish');
})
const server = app.listen(3000, () => {
console.log(`Example app listening on port ${port}`)
})
// Set timeout to 2:04min
server.setTimeout(124000);
Если вы откроете http://localhost:3000/export, то в результате выполнения кода, приведенного выше, вернется:
Starting request
<- в начале </p>
Starting request
<- на отметке 2:04 </p>
Это какая-то проблема из-за асинхронности / ожидания, поскольку кажется, что res.send()
никогда не срабатывает?
Может кто-нибудь уточнить, "почему" это происходит и "как" предотвратить это?
PS: Я не могу использовать флаг или что-то еще, чтобы проверить, был ли уже сделан запрос, поскольку приложение должно работать для пользователей, экспортирующих данные одновременно, и приходит второй запрос как новый.