Я использую Firebase Admin SDK в своих облачных функциях, и я получаю ошибку случайно в некоторых выполнениях при попытке получить пользователя по uid.
let userRecord = await admin.auth().getUser(userId);
Ошибкаподробности:
{"error":{"code":400,"message":"TOO_MANY_ATTEMPTS_TRY_LATER",
"errors":[{ "message":"TOO_MANY_ATTEMPTS_TRY_LATER",
"domain":"global","reason":"invalid"}]
}
}
Моя облачная функция выполняется в базе данных реального времени write
и может быть запущена для нескольких пользователей.В общей сложности у меня есть 4 вызова функций аутентификации за одно выполнение: первый - выше, второй - чтобы снова получить пользователя по uid
или email
, третий вызов - generateEmailVerificationLink
и последний вызов generatePasswordResetLink
.
Я проверил ограничения скорости в документации для аутентификации, но там нет упоминания ограничения скорости для этих операций.Также ошибка TOO_MANY_ATTEMPTS_TRY_LATER
была упомянута только в REST API для регистрации с паролем электронной почты.
Если эта ошибка связана с ограничением скорости, что я должен изменить, чтобы предотвратить эту ошибку, учитывая, что эти 4 вызова необходимы для операциинеобходимо для записи в базу данных?.
РЕДАКТИРОВАТЬ:
Я определил фактический вызов, который вызывает слишком много попыток ошибки.Вызовы auth().generateEmailVerificationLink()
и auth().generatePasswordResetLink()
выдают эту ошибку при вызове слишком много раз.
Я назвал эти два в цикле с 100 итерациями и ждал обещаний.Первое выполнение заканчивается без ошибок, т.е. 200 запросов.Но запуск второго выполнения, как только закончится первый, приведет к ошибке слишком большого числа попыток.Поэтому я думаю, что эти два звонка имеют ограничение.Сейчас я пытаюсь уменьшить эти звонки и повторно использовать информацию о ссылках.Другие звонки вроде getUserByEmail
отлично работают.
let promises = [];
let auth = admin.auth();
let hrstart = process.hrtime()
for (let i = 0; i < 100; i++) {
promises.push(auth.getUserByEmail("user email"));
promises.push(auth.generateEmailVerificationLink("user email", {url: `https://app.firebaseapp.com/path`}));
promises.push(auth.generatePasswordResetLink("user email", {url: `https://app.firebaseapp.com/path`}));
}
Promise.all(promises)
.then(value => {
let hrend = process.hrtime(hrstart);
console.log(hrend);
// console.log(value)
});