首页 文章

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

提问于
浏览
1

我在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身份验证部分,但实时数据库不包含带有电子邮件的节点 . 这个问题非常零星 . 有时候它会很好地将它注册到实时数据库中,但有时却没有(就像在Jun 25的日志中那样) . 在Android应用程序中,我尝试在注册后查询用户的数据库节点以显示他们的电子邮件,然后我收到错误(可能是我的应用程序中的错误,但无论如何,那里的代码应该在服务器端运行,电子邮件应该在Firebase实时数据库中) .

我还不知道的是,为什么我在日志中有 removeUserProfile 调用,因为我没有从Authentication数据库或Realtime数据库中删除任何用户 .

1 回答

  • 2

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

    既然你写了"The problem is very sporadic"可能发生的事情是 initializeUserProfile 首先在 /profiles/${userUid} 创建新记录 BUT 然后被 removeUserProfile Cloud 函数删除 .

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

    exports.removeUserProfile = functions.auth.user().onDelete((user) => {
       const userUid = user.uid;
    
       return admin.database().ref(`/profiles/${userUid}`).remove();.
    });
    

相关问题