Firebase函数无法始终将用户保存到实时数据库

时间:2018-06-26 04:33:45

标签: firebase firebase-realtime-database

我在Android应用中使用Firebase身份验证和实时数据库。这是我在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的内置注册UI),它在功能日志中没有显示任何错误:

enter image description here

我的问题是,尽管日志中没有错误,并且用户已添加到Firebase身份验证部分,但Realtime数据库不包含带有电子邮件的节点。这个问题非常零星。有时它可以很好地将其注册到实时数据库中,但有时却不能(例如6月25日的日志)。在Android应用程序中,我尝试在注册后查询用户的数据库节点以显示他们的电子邮件,并且出现错误(也许这是我的应用程序中的错误,但是无论如何,那里的代码应该在服务器端运行,该电子邮件应位于Firebase实时数据库中。

我还不知道的是,为什么我没有从身份验证数据库或实时数据库中删除任何用户,所以为什么在日志中有这些removeUserProfile调用。

1 个答案:

答案 0 :(得分:2)

实际上,您的两个Cloud Function是通过完全相同的事件(即onCreate(user))触发的。因此,正常的是(几乎)同时触发它们,并且您会在日志中看到两个调用。

由于您写道“问题非常零星”,因此可能发生的情况是,新记录由/profiles/${userUid}云函数 BUT 首先在initializeUserProfile创建然后由removeUserProfile云功能删除。

因此,您应该将removeUserProfile Cloud Function的触发器更改为onDelete()

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

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