Search code examples
javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functionsalgolia

Why is my data import to Algolia search using the API script timing out


I am trying to implement single index searching using Algoliasearch for my iOS mobile app. I have about 110 users on my application. However, when I upload their data to Algolia search's index the function times out before uploading all users. Instead it throws an Error message in the http browser and declares a timeout in the Firestore console.

Firestore console:

sendCollectionToAlgolia

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

I created the function using this tutorial: https://medium.com/@soares.rfarias/how-to-set-up-firestore-and-algolia-319fcf2c0d37

Although i have ran into some complications, I highly recommend that tutorial if you have your app using swiftUI iOS platform and implement cloud functions using Typescript.

Heres my function:

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.");
    });

});

Solution

  • If you just want to change the default 1 minute timeout, you can do that when you configure the function.

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

    Increasing the timeout won't help if your function doesn't end up sending a response, so you should also add some logging/debugging to figure out if the final call to res.send() is actually happening. If the function never sends a response, it will definitely time out no matter what happens.