#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()
. Если функция никогда не отправляет ответ, время ожидания обязательно истечет, что бы ни случилось.