代码之家  ›  专栏  ›  技术社区  ›  Yulian

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

  •  0
  • Yulian  · 技术社区  · 6 年前

    我有一个 更新 触发我的 用户 更新相应用户配置文件的集合。

    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云函数来处理用户更新?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Renaud Tarnec    6 年前

    如果出现错误,您可以使用Cloud函数将数据写入 /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应用程序?Android应用程序?iOS应用程序?)。

    注意,在Cloud函数中,可以利用 admin.auth().updateUser()

    https://firebase.google.com/docs/auth/admin/errors

    https://firebase.google.com/docs/auth/admin/manage-users#update_a_user ,声明:

    如果提供的uid与现有用户不对应,则 或者用户由于其他原因无法更新,上述方法