Функции Firebase не всегда могут сохранить пользователя в базу данных в реальном времени - PullRequest
0 голосов
/ 26 июня 2018

Я использую аутентификацию Firebase и базу данных в реальном времени в своем приложении для Android.Это код, который я использую в функциях Firebase, чтобы сохранить электронную почту пользователя в базе данных в реальном времени, когда он регистрируется в приложении с электронной почтой:

'use strict';

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

exports.initializeUserProfile = functions.auth.user().onCreate(user => {
    const userUid = user.uid;

    return admin.auth().getUser(userUid).then(userRecord => {
        const userProfile = {
            email: userRecord.email
        };
        return admin.database().ref(`/profiles/${userUid}`).set(userProfile);
    }).catch(error => {
        console.log("Error fetching user data: ", error);
    });
});

exports.removeUserProfile = functions.auth.user().onCreate(user => {
    const userUid = user.uid;

    return admin.database().ref(`/profiles/${userUid}`).remove();
});

Когда я регистрирую пользователя в приложении для Android (я используювстроенный пользовательский интерфейс регистрации для Firebase), он не выдает ошибку в журналах функций:

enter image description here

Моя проблема в том, что, хотя у меня нетошибка в журнале, и пользователь был добавлен в раздел Аутентификация Firebase, база данных реального времени не содержит узла с электронной почтой.Проблема очень спорадическая.Иногда он прекрасно регистрирует его в базе данных реального времени, но иногда нет (как в журнале от 25 июня).В приложении Android я пытаюсь запросить узел базы данных пользователя после регистрации, чтобы отобразить их электронную почту, и там я получаю сообщение об ошибке (возможно, это ошибка в моем приложении, но в любом случае этот код должен выполняться на стороне сервера иэлектронная почта должна быть в базе данных Firebase Realtime).

Чего я также не знаю, так это того, почему у меня есть эти removeUserProfile вызовы в журнале, поскольку я не удалил ни одного пользователя из базы данных аутентификации.или из базы данных в реальном времени.

1 Ответ

0 голосов
/ 26 июня 2018

На самом деле, две ваши облачные функции запускаются с одинаковым событием, то есть onCreate(user).Так что это нормально, что они запускаются (почти) одновременно, и что вы видите два вызова в журнале.

Поскольку вы пишете, что «проблема очень спорадическая», то, вероятно, происходит то, что новая записьсначала создается в /profiles/${userUid} с помощью initializeUserProfile Облачной функции НО , затем удаляется с помощью removeUserProfile Облачной функции.

Таким образом, вы должны изменить триггер облачной функции removeUserProfile на onDelete():

exports.removeUserProfile = functions.auth.user().onDelete((user) => {
   const userUid = user.uid;

   return admin.database().ref(`/profiles/${userUid}`).remove();.
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...