Я использую 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)
});
generatePasswordResetLink
? - person bojeil   schedule 15.02.2019