#javascript #node.js #firebase
#javascript #node.js #firebase
Вопрос:
Я пытаюсь обновить информацию по электронной почте и пароль списка пользователей, однако я изо всех сил пытаюсь заставить это работать должным образом. Я получаю запрос, завершенный со статусом тайм-аута, без выполнения для всех пользователей в массиве.
Вот фрагмент моего кода:
exports.updateUserInfo = functions.https.onRequest(async (req, res) => {
let users = getUIDsToUpdateInfo();
let timeout = 0;
for(let uid of users){
console.log(`${uid}: Preparing to update user at ${timeout} ms` )
// Once firebase not handle well multiple calls, create a delay for each call
setTimeout(() => {
let newPass = getNewPassForUser(uid);
admin.auth().updateUser(uid, {
password: newPass,
emailVerified: false
})
.then(() => {
console.log(`uid: ${uid} - User info has been changed.`);
}).catch((error) => {
console.log(`uid: ${uid} - Fail to change user info`, error);
});
}, timeout)
timeout = 200;
}
setTimeout(() => {
res.status(200).send("OK!");
}, timeout)
});
Когда массив uid слишком велик (например, более 250), функция завершается с помощью: Function execution took 60004 ms, finished with status: 'timeout'
без выполнения для всех uid.
Есть ли способ выполнить все эти вызовы в фоновом режиме и немедленно отправить ответ на запрос?
Ответ №1:
Вы можете увеличить время ожидания функции, если это займет больше времени, чем время ожидания по умолчанию, равное 60 секундам.
Если вам нужно выполнить больше работы, чем может быть выполнено за максимальный тайм-аут в 9 минут, вам придется найти какой-то способ поставить работу в очередь и выполнять ее пакетно, чтобы функция http могла отправить ответ до истечения тайм-аута. Вы могли бы сделать это, отправив сообщения в функцию pubsub, которую для каждой учетной записи необходимо изменить.
Комментарии:
1. Хм, интересно. Увеличение времени ожидания может решить мою проблему на данный момент. Но в будущем, наверняка, мне понадобится другой способ заставить это работать. Спасибо за ответ и ссылки.
2. В Stack Overflow, если ответ был полезным, принято повышать голос и отмечать ответы как правильные с помощью кнопок слева.