Firestore простой collectionGroup делает функцию тайм-аут - PullRequest
0 голосов
/ 14 января 2020

У меня есть облачная функция, которая должна запускаться каждые 2 минуты. В настоящее время я тестирую функцию, используя Http, и пытаюсь выполнить простой запрос collectionGroup следующим образом

Обновление 1 Я обновил свой код для обработки offset и limit но теперь он работает нормально для первой записи, а затем зависает при получении второй записи.

проверьте фрагмент

/* eslint-disable promise/no-nesting */

/**
 * @description
 * This module will send out emails to different users who have alerts not sent out yet
 * @algorithm
 * 1 - Get all alerts where sent = false 
 * 2 - Send out those alerts via the email module. 
 */
const functions = require("firebase-functions");
const { db } = require("../helpers/firestore");
// console.log('admin: ', admin);
let _allUserAlerts = [];
let counter = 0;

exports.sendEmailsToUsers = functions.pubsub
  .schedule("every 2 minutes")
  .onRun(context => {
    return sendEmailsToUsers(context);
  });

exports.testSendEmailsToUsers = functions.https.onRequest((req, res) => {
  return sendEmailsToUsers("hello");
});

async function sendEmailsToUsers(context) {
  try {
    console.log("function execution")
    let alerts = await db
      .collectionGroup("alerts")
      .where("sent", "==", false)
      .limit(1)
      .offset(counter)
      .get();

    alerts.forEach(_alert => {
      if (_alert.exists) {
        console.log("alert exists")
        _allUserAlerts.push(_alert.data());
        counter++;
        return sendEmailsToUsers()
      } else {
        console.log("alert ends")
        sendAlertsToEmail(_allUserAlerts)
      }
    })
  } catch (err) {
    console.log(err)
  }
}

async function sendAlertsToEmail(alerts) {
  console.log('alerts: ', alerts);
}

Старый код

/* eslint-disable promise/no-nesting */

/**
 * @description
 * This module will send out emails to different users who have alerts not sent out yet
 * @algorithm
 * 1 - Get all alerts where sent = false 
 * 2 - Send out those alerts via the email module. 
 */
const functions = require("firebase-functions");
const { db } = require("../helpers/firestore");
const { Email } = require("../EmailModule");

const { groupBy } = require("../helpers/groupBy");

exports.sendEmailsToUsers = functions.pubsub
  .schedule("every 2 minutes")
  .onRun(context => {
    return sendEmailsToUsers(context);
  });

async function sendEmailsToUsers(context) {
  try {
    console.log("function execution")
    let alerts = await db
      .collectionGroup("alerts")
      .where("sent", "==", false)
      .get();
    console.log('alerts: ', alerts);
  } catch (err) {
    console.log(err)
  }
}

Это буквально весь код функции, но время выполнения функции и я не дохожу до log() из alerts. Я не понимаю, в чем может быть проблема здесь? Что-нибудь, что я мог бы пропустить или не попасть сюда? Любая помощь будет оценена.

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 января 2020

Похоже, вы запрашиваете слишком много данных для передачи и хранения в памяти без проблем. Вместо этого я рекомендую разбивать на страницы ваши данные с помощью limit(), чтобы вы могли пакетно обрабатывать результаты, не превышая пределов экземпляров сервера Cloud Functions (которые весьма ограничены). Начните с малого и продолжайте свой путь.

0 голосов
/ 20 февраля 2020

Решением этой проблемы было обновление текущей версии узла. По умолчанию облачные функции работают на Node 8, что прекратило поддержку официальной команды node.js. Поэтому, когда я обновляюсь до Node 10, он снова начал отлично работать!

0 голосов
/ 14 января 2020

Может быть, процесс просто занимает более 60 с. Вы можете увеличить время ожидания функции облака. Вы можете поднять его до 9 минут, и он должен работать.

В противном случае проблема, похоже, не в самой функции. Проблема может быть где-то здесь: const { db } = require("../helpers/firestore");. «db» не приходит, и ваш код останавливается на let alerts = await db.

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