Экспресс запрос срабатывает второй раз - PullRequest
3 голосов
/ 22 марта 2019

Я здесь немного застыл.

Я создаю экспресс-приложение, которое должно экспортировать огромное количество данных из магазина 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: Я не могу использовать флаг или что-то еще, чтобы проверить, был ли уже сделан запрос, поскольку приложение должно работать для пользователей, экспортирующих данные одновременно, и приходит второй запрос как новый.

1 Ответ

1 голос
/ 22 марта 2019

Что ж, сегодня я потерял около 4 часов на этом и пришел к выводу, что мой сервис туннелей (http://serveo.net/) выполнял другой запрос в какой-то момент, точно рассчитанный по завершении экспорта.(что касается того, почему у меня нет ответа на этот вопрос) Я все еще не уверен, что это правильный вывод, но переключение на другую опцию (или использование прямого localhost) не показало никаких проблем.

Я перешел на OpenVPN, и все мои проблемы исчезли.Ngrok тоже был в порядке, но, поскольку в бесплатной версии не было фиксированного URL-адреса (и каждый день, когда я запускаю службу, меняются все конечные точки в настройке приложения), я пошел с OpenVPN.

Корень проблемы заключался в том, что res.status(200).send('Finish') никогда не стрелял по какой-то конкретной причине или, если это так, конечно, не выглядело так.

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...