I have the following code that gets a random Firestore document given some parameters
const { onSchedule } = require("firebase-functions/v2/scheduler");
const { logger } = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
var db = admin.firestore();
function getRandomFromCollection(collection, level, enabled) {
return new Promise(function (resolve, reject) {
logger.info("Starting random search")
let key = collection.doc().id;
logger.info("random key done");
collection.where("enabled", "==", enabled).where("level", "==", level).where("__name__", '>=', key).limit(1).get()
.then(snapshot => {
if (snapshot.size > 0) {
snapshot.forEach(doc => {
logger.info("done");
resolve(doc);
});
}
else {
collection.where("enabled", "==", enabled).where("level", "==", level).where("__name__", '<', key).limit(1).get()
.then(snapshot => {
snapshot.forEach(doc => {
logger.info("done");
resolve(doc);
});
})
.catch(err => {
logger.info("error");
reject(err);
});
}
})
.catch(err => {
logger.info("error");
reject(err);
});
});
}
exports.newQuestions = onSchedule({
schedule: "every day 9:55",
maxInstances: 1,
timeZone: "UTC"
},
async (event) => {
let collection = db.collection("questions");
getRandomFromCollection(collection, 1, false).then(doc => {
logger.info("Got question");
}).catch(err => {
logger.error(`ERROR! Something when wrong when generating question! Error: ${err}`)
})
});
I have ran this code many times in the functions emulator with no issue but when I deploy it to firebase to be ran once a day it seems to fail around every 1 in 5 calls.
When the error occurs the function logs shows the “Starting random search” and “Random key done” but then returns nothing else and the promise isn’t resolved or rejected.