如果在Firebase触发器中发生错误,如何向客户端抛出错误?

vfh0ocws  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(625)

我在我的users集合上有一个onUpdate触发器,用于更新相应的用户配置文件。

exports.onUpdateUser = functions.firestore.document('/users/{uid}')
.onUpdate((change, context) => {
    const { uid } = context.params;
    const { email, displayName, photoURL } = change.after.data();

    return admin.auth().updateUser(uid, {
        email,
        displayName,
        photoURL
    });
});

如果提供的电子邮件已经存在,则触发器可能会抛出错误。在这种情况下,我想放弃对用户文档所做的更改,然后让客户端知道该错误。
使用上面的实现,文档将被成功更新,触发器将在客户端不知道的情况下无声地抛出错误。
我可以改变这种行为吗?或者我唯一的选择是实现一个单独的HTTP云函数来处理用户更新?

pbgvytdp

pbgvytdp1#

在出现错误的情况下,您可以使用Cloud Function写入/users/{uid}节点下的特定子节点,并让客户端前端侦听该子节点。
云函数代码如下所示:

exports.onUpdateUser = functions.firestore.document('/users/{uid}')
.onUpdate((change, context) => {
    const { uid } = context.params;
    const { email, displayName, photoURL } = change.after.data();

    return admin.auth().updateUser(uid, {
        email,
        displayName,
        photoURL
    })  
    .catch(error => {
        if (error == "auth/email-already-exists") {

           return admin.database().ref('/users/' + uid).set({updateError: true})
           .catch(error => {
                console.log("Error reporting email error");
                return false;
           });

        } else {
            console.log("Error updating user:", error);
            return false;
        }
    });

});

在前端监听/users/{uid}/updateError节点,如果写入新值,则显示警报/消息。确切的侦听器语法取决于您的前端技术(Web应用程序?安卓应用?iOS app?)。
请注意,在Cloud Function中,您利用了admin.auth().updateUser()方法的错误管理以及它返回特定代码的事实。
参见https://firebase.google.com/docs/auth/admin/errors
和https://firebase.google.com/docs/auth/admin/manage-users#update_a_user,其中指出:
如果提供的uid与现有用户不对应,提供的电子邮件或电话号码已被现有用户使用,或者由于任何其他原因无法更新用户,则上述方法失败并出错。

相关问题