Я создал службу очереди, используя триггеры Firestore, однако у меня возникают некоторые проблемы при работе курсора.
Каждые 5 минут срабатывает следующая функция. Он проверяет, установлен ли запущенный документ коллекции очереди, если нет, то получает первый документ, получает поле id из этого документа и обновляет документ коллекции очереди
exports.scheduledFunction = functions.pubsub.schedule('every 5 minutes').onRun(async(context) => {
try{
const q = await admin.firestore().collection('queueService').doc('extension').get();
const status = q.data().status;
if(status !== "start" || status !== "continue) {
const first = admin.firestore().collectionGroup('extItems')
.where('platform', "==", "mba")
.orderBy('created_at')
.limit(1);
const snapshot = await first.get();
await firestoreUpdateCursor(snapshot.docs[0].data().id, 1, "start", "extension");
} else {
console.log('Sync is currently running')
}
} catch (e) {
console.log(e.message)
}
});
. Функция нижезатем срабатывает при обновлении документа коллекции queueService. Я хочу, чтобы он использовал курсор startAt
. Затем он получит документы, как показано ниже, выполнит X с ними, а после этого обновит queueService с последним идентификатором, что вызовет функцию снова, пока не останется больше элементов.
module.exports = functions.firestore.document("queueService/extension").onUpdate(async(change, context) => {
try {
const {cursor, lastCount, status} = change.after.data();
const iPromises = [];
const fullfilled = [];
let next;
if(lastCount > 0) {
if(status === "start" || status === "continue") {
next = admin.firestore().collectionGroup('extItems')
.where('platform', "==", "mba")
.orderBy('created_at')
.startAt(cursor)
.limit(100);
} else {
console.log("Extension Items already processing");
return null;
}
const result = await next.get();
console.log(result.docs.length);
if(result.docs.length <= 0) return await firestoreUpdateCursor(null, result.docs.length, null, "extension");
//do more stuff
await firestoreUpdateCursor(result.docs[result.docs.length - 1].data().id, result.docs.length, "continue", "extension")
}
} catch (e) {
console.log(e.message)
}
});
Проблема, с которой я сталкиваюсь, заключается в том, что мой курсор не работает. Запланированная функция обновляет queueService нормально, но затем сработавшая функция не возвращает документов