Аутентификация Firebase занимает слишком много времени для создания пользователя в облачной функции - PullRequest
1 голос
/ 07 мая 2020

в настоящее время у меня проблема, когда вызов метода auth # createUser занимает до 10 секунд, чтобы перейти к вызову его метода Promise#then. Я получаю эти временные метки из регистратора функций firebase и Google Cloud. Я чувствую, что делаю что-то не так, но не могу понять, что делаю неправильно. Прежде чем вы скажете обратиться в службу поддержки firebase, я уже это сделал, и они сказали мне прийти сюда.


const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

let database = admin.firestore();

exports.createUser = functions.https.onCall((data, response) => {
    console.log(data);
    console.log(response);

    admin.auth().createUser({
        email: data.email,
        emailVerified: false,
        password: data.password,
        displayName: data.name,
        disabled: false,
    }).then(user => {
        database.collection('users').doc(data.username).set({
            uid: user.uid,
            email: data.email,
            name: data.name,
            username: data.username
        }).catch(error => {
            throw new functions.https.HttpsError(error)
        });
        console.log('The entire thing is done successfully!');
        return {
            response: user
        }
    }).catch(error => {
        throw new functions.https.HttpsError(error);
    });
    console.log('Found my way to the end of the method');
});

1 Ответ

2 голосов
/ 07 мая 2020

Вы неправильно выполняете обещания. Функции onCall должны возвращать обещание, которое разрешается с данными, которые вы хотите вернуть клиенту. Прямо сейчас ваша функция ничего не возвращает. Оператор return внутри обратного вызова then на самом деле ничего не отправляет клиенту. Вместо этого вам нужно будет вернуть цепочку обещаний:

return admin.auth().createUser(...).then(...).catch(...)

Обратите внимание на возврат перед всем этим.

Кроме того, вам нужно будет обработать обещание, возвращаемое set(). Просто позвонить по номеру catch недостаточно. Вам также нужно будет вернуть это обещание из обратного вызова then.

Я настоятельно рекомендую изучить, как работают обещания в JavaScript - без надлежащей обработки ваши функции просто не будут работать правильно и часто будут вести себя в путаные способы.

...