Почему время ожидания моего импорта данных в Algolia Search с использованием скрипта API истекло

#javascript #firebase #google-cloud-firestore #google-cloud-functions #algolia

#javascript #firebase #google-облако-firestore #google-cloud-функции #algolia

Вопрос:

Я пытаюсь реализовать поиск по одному индексу с помощью Algoliasearch для моего мобильного приложения iOS. В моем приложении около 110 пользователей. Однако, когда я загружаю их данные в индекс Algolia search, время ожидания функции истекает перед загрузкой всех пользователей. Вместо этого он выдает сообщение об ошибке в браузере http и объявляет тайм-аут в консоли Firestore.

Консоль Firestore:

 sendCollectionToAlgolia

Function execution took 60044 ms, finished with status: 'timeout'
  

Я создал функцию с помощью этого руководства:
https://medium.com/@soares.rfarias/how-to-set-up-firestore-and-algolia-319fcf2c0d37

Хотя я столкнулся с некоторыми сложностями, я настоятельно рекомендую это руководство, если ваше приложение использует платформу SwiftUI iOS и реализует облачные функции с помощью Typescript.

Вот моя функция:

 import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import algoliasearch from 'algoliasearch';

admin.initializeApp();
const db = admin.firestore();

const algoliaClient = algoliasearch(functions.config().algolia.appid, functions.config().algolia.apikey)
const collectionIndexName = functions.config().projectId === 'PROJECT-XXXX' ? 'prod_SEARCH' : 'dev_SEARCH';
const collectionIndex = algoliaClient.initIndex(collectionIndexName);
//rename to uploadUsersToAlgolia
export const sendCollectionToAlgolia = functions.https.onRequest(async (req, res) => {

    const algoliaRecords: any[] = [];

    const querySnapshot = await db.collection('users').get();

    querySnapshot.docs.forEach(doc => {
        const document = doc.data();

        const record = {
            objectID: doc.id,
            fullname: document.fullname,
            bio: document.bio,
            username: document.username,
            uid: document.uid,
            profileImageURL: document.profileImageURL,
            backgroundImageURL: document.backgroundImageURL,
            fcmToken: document.fcmToken,
            accountCreated: document.accountCreated,
            inspirationCount: document.inspriationCount,
            BucketListCount: document.BucketListCount,
            CompletedBucketListCount: document.CompletedBucketListCount,
            FriendsCount: document.FriendsCount
        };

        algoliaRecords.push(record);
    });

    // After all records are created, we save them to 
    collectionIndex.saveObjects(algoliaRecords, (_error: any, content: any) => {
        res.status(200).send("users collection was indexed to Algolia successfully.");
    });

});
  

Комментарии:

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

2. возможно, я не уверен, что написал функцию слишком неэффективно, чтобы загрузить все данные до истечения времени ожидания. Есть ли способ настроить тайм-аут для продления таймера, или я должен загружать пользовательские данные в группах? @DougStevenson

Ответ №1:

Если вы просто хотите изменить время ожидания по умолчанию в 1 минуту, вы можете сделать это при настройке функции.

 functions.runWith({timeoutSeconds: X}).https.onRequest(async (req, res)
  

Увеличение времени ожидания не поможет, если ваша функция в конечном итоге не отправляет ответ, поэтому вам также следует добавить некоторое ведение журнала / отладку, чтобы выяснить, действительно ли происходит окончательный вызов res.send() . Если функция никогда не отправляет ответ, время ожидания обязательно истечет, что бы ни случилось.