При запуске из облачных задач срок выполнения задачи App Engine Node превышен - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть приложение Node JS App Engine, которое использует запрос Promise Native для извлечения внешних URL-адресов.Сценарии App Engine, запущенные из облачных задач, должны иметь срок до 24 часов, но все мои задачи убиваются через 60 секунд.Я знаю, что другие фреймворки должны использовать встроенную библиотеку URLFetch, и это дает им автоматический 60-секундный срок выполнения задачи, но в документах ничего не говорится о задачах ядра приложения баз Node.JS.Эта задача извлекает json из внешнего URL-адреса, затем обрабатывает результаты и вставляет их в базу данных Firebase, что обычно происходит, когда задача завершается с ошибкой HTTP 504 Deadline Exceeded

app.post('/tasks/import', async (req, res) => {
  const paramsObj = JSON.parse(Buffer.from(req.body, 'base64').toString('utf-8'));

  const page = paramsObj.page * 1;
  const storeID = paramsObj.storeid;
  const pageSize = 50;
  const config: StoreConfig = await getConfigById(storeID);

  const options = {
    uri: EXTERNAL_URL,
    json: true,
    resolveWithFullResponse: false,
    qs: {
      limit: pageSize,
      page: page,
    },
  };

  try {
    const results = await rp.get(options);
    if (results.products.length === 0) {
      return res.status(200).end();
    }

    const prodLooper = idx => {
      const product = results.products[idx];
      product.store_id = storeID;
      product.body_html = cleanProductBody(product.body_html);
      getUnusedUPC(storeID)
        .then(upcID => {
          product.upc = upcID;

          fsdb
            .collection('products')
            .add(product)
            .then(() => {
              idx++;
              if (idx < results.products.length) {
                prodLooper(idx);
              } else {

                return res.send('OK').end();
              }
            });
        })
        .catch(err => {
          console.log(err.code, ':', page, ':', idx);
          if (err.code === 10) {
            setTimeout(() => {
              prodLooper(idx);
            }, 10);

          }
        });
    };
    prodLooper(0);
  } catch (error) {
    console.log('caught error:');
    console.log(error.statusCode);
    console.log(error.message);
    return res.status(500).end();
  }
});

1 Ответ

0 голосов
/ 27 декабря 2018

В соответствии с документацией :

google.appengine.runtime.DeadlineExceededError: повышается, если общий запрос истекает, обычно через 60 секунд или 10 минут для очереди задачзапросы.

В той же документации также приведены некоторые распространенные ошибки, которые могут вызвать это, и предложения о том, как их избежать.

...