Возможно ли запустить более длинную фоновую задачу с помощью Next JS? - PullRequest
0 голосов
/ 23 сентября 2019

Далее JS, кажется, автоматически «очищает» API-скрипты, используя некоторую логику после их вызова (я предполагаю, что это некоторый период времени после того, как «res» вызывается обратно. Можно ли сохранить скрипт работающим длянеопределенный период времени после перезапуска res, чтобы он оставался активным до тех пор, пока не будет завершено какое-либо более продолжительное выполнение фоновой активности (например, медленный рендеринг)?

Простой пример, конечная точка, которую можно «опросить» для запусказадача во время ее обработки и в конечном итоге ответит завершенным результатом:

api/myscript

код:


var result = null
var processing = true

export default (req, res) => {
  if (result) {
    res.end(result)
  } else if (!processing) {
    new Promise((result, reject) => {
      exec(cmd, ("ffmpeg -takeareallylongtime", stdout, stderr) => {
      if (error) {
        reject(error);
      }
      else {
        resolve("All done");
      }
    })})
    .then(_ => {
      result = "All done!"
    })
    .catch(_ => {
      result = "I'm sorry to have failed you."
    })
    res.end("Started task")
  } else {
    res.end("Still processing...")
  }
}

Я наблюдаю за поведением бегуназапускается, клиент периодически опрашивает и возвращает действительный статус, и в какой-то момент во время обработки страница очищается:

[ event ] disposing inactive page(s)

и результаты отслеживания глобальных значений очищаются.

1 Ответ

0 голосов
/ 23 сентября 2019

Если ваши вызовы API имеют тайм-аут, то это фактически означает, что ваш сервер Node / Express блокирует ваши запросы API.Вы можете увеличить время ожидания по умолчанию, используя следующий код

var server = app.listen();
server.setTimeout(10 * 60 * 1000);

Если это очень длительные задачи, вы можете исследовать их с помощью WebSockets с помощью socket.io или методов длинного опроса.

...