Firestore Cloud Function Array Loop - записывает длинную задержку - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть облачная функция, которая перебирает массив uids, а затем создает запись для каждого. Нормальные записи происходят почти мгновенно, но здесь есть большое отставание, прежде чем они появятся.

Я пробовал на массив разных размеров. Массив с одним или двумя uid быстрее, но все равно имеет задержку около 5-6 секунд.

exports.addPostings = functions.firestore
    .document('posts/{postID}')
    .onCreate((snap, context) => {
    const newValue = snap.data();
    var uid = newValue.author.uid;
    let followers = [];
    var feedRef = db.collection("feedItems");
    var authorRef = db.collection("users").doc(newValue.author.uid);
    authorRef.get().then((doc) => {
        let data = doc.data();
        let post_count = data.postCount;
        authorRef.update({
            postCount: Number(post_count) + 1
        }).then(() => {
            authorRef.collection('followers').doc('content').get().then((doc) => {
                let data = doc.data();
                if (typeof data.uids != 'undefined') {
                    followers = data.uids;
                }
            }).then(() => {
                followers.forEach((fol) => {
                  feedRef.add({
                      createdAt: admin.firestore.FieldValue.serverTimestamp(), uid: fol, creatorUid: uid,
                      postId: context.params.postID, isResharedPost: false, wasViewed: false,
                      wasReshared: false, wasLiked: false, wasDirectlyShared: false
                  });
                });
            });
        });
    });
});

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Есть несколько моментов, которые вы должны изменить в своем коде:

  1. Вы не возвращаете обещания, возвращаемые асинхронными методами, , что является ключевым при написании кода функции облака ,как объяснено в 3 видео о "Обещаниях JavaScript" из официальной серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/
  2. Вы должны правильно связать обещания
  3. Вы должны использовать пакетную запись, как указано в CuriousGeorge

Следующие модификации должны помочь (не проверено!):

exports.addPostings = functions.firestore
  .document('posts/{postID}')
  .onCreate((snap, context) => {
    const newValue = snap.data();
    var uid = newValue.author.uid;
    let followers = [];
    var feedRef = db.collection('feedItems');
    var authorRef = db.collection('users').doc(newValue.author.uid);

    return authorRef
      .get()
      .then(doc => {
        let data = doc.data();
        let post_count = data.postCount;
        return authorRef.update({
          postCount: Number(post_count) + 1
        });
      })
      .then(() => {
        return authorRef
          .collection('followers')
          .doc('content')
          .get();
      })
      .then(doc => {
        let data = doc.data();
        if (typeof data.uids != 'undefined') {
          followers = data.uids;

          let batch = db.batch();

          followers.forEach(fol => {
            const ref = feedRef.doc();
            batch.set(ref, {
              createdAt: admin.firestore.FieldValue.serverTimestamp(),
              uid: fol,
              creatorUid: uid,
              postId: context.params.postID,
              isResharedPost: false,
              wasViewed: false,
              wasReshared: false,
              wasLiked: false,
              wasDirectlyShared: false
            });
          });

          // Commit the batch
          return batch.commit();
        } else {
          return null;
        }
      });
  });
0 голосов
/ 19 апреля 2019

Кроме того, вы должны изучить использование транзакций. Это позволяет вам определять серии операций чтения / записи, а затем выполнять их все одновременно. Одна из причин, по которой этот метод может быть медленным, заключается в том, что вы выполняете несколько операций чтения / записи (и это также плохо в случае сбоя в середине обработки). https://firebase.google.com/docs/firestore/manage-data/transactions#transactions

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