Это сбивает с толку меня. Я шесть месяцев в проекте Firebase и использую Javascript для FireBase-функций. Я многому научился, добавляя транзакции, обещания, пакетные записи и хитрые уловки. Тем не менее, похоже на то, что функция работает правильно. Чаще всего функции выполняются правильно, но бывают странные периоды, когда пакеты последовательных вызовов функций выполняются наполовину без ошибок в журналах.
Например. У меня есть функция, когда новый пользователь присоединяется к моему приложению. Он немного строит данные сервера, а также уведомляет двух администраторов о присоединении нового пользователя. Прошлой ночью я выполнил тестовый прогон с двумя новыми пользователями и не получил уведомления, но их профили пользователей правильно скомпонованы в базе данных сервера. Я проверил журналы функций и не было ошибок.
Не правильно ли я выполняю Обещания? Если функция firebase зависает, не испортит ли она следующие несколько вызовов функций?
exports.onNewUser = functions.firestore
.document('/users/{userId}')
.onCreate(async (snapshot, context) => {
user = snapshot.data().username;
//Notification payload
const payload = {
notification: {
title: `New user!`,
body: `${user} has joined [AppName]`
}
};
var promises = [];
//Check if usename unique
var passed = true;
promises.push(db.runTransaction(async t => {
const docRef = db.collection('users').doc('index');
const doc = await t.get(docRef);
var newIndex = doc.data().usernames;
if (newIndex[user.toUpperCase()] == true) {
t.delete(snapshot.ref);
passed = false;
return null;
} else {
newIndex[user.toUpperCase()] = true;
t.set(docRef, { 'usernames': newIndex });
}
}));
if (!passed) return Promise.all(promises);
//add new user to Algolia database
const algoliasearch = require('algoliasearch');
const algoliaClient = algoliasearch(functions.config().algolia.appid, functions.config().algolia.apikey);
const collectionIndex = algoliaClient.initIndex(collectionIndexName);
await saveDocumentInAlgolia(snapshot, collectionIndex);
//Notify Admins
db.collection('notificationTokens')
.doc(admin1)
.get().then((doc) => {
if (doc.exists && doc.data().notificationToken != null)
promises.push(pushNotification(doc.data().notificationToken, payload));
});
db.collection('notificationTokens')
.doc(admin2)
.get().then((doc) => {
if (doc.exists && doc.data().notificationToken != null)
promises.push(pushNotification(doc.data().notificationToken, payload));
});
return Promise.all(promises);
});