【问题标题】:Using a Cloud Function to Update a Firebase Realtime Database Reference to Add Data使用云函数更新 Firebase 实时数据库引用以添加数据
【发布时间】:2021-10-25 21:40:29
【问题描述】:

我正在注册一位客户,将他们的 stripeID、uid 和电子邮件上传到我的 Firebase 实时数据库,然后将他们的个人资料图片上传到 Firebase 存储。但是,我想知道是否需要更新 Cloud Function 来将全名、用户名和个人资料图片添加到客户参考中?还是我需要重构我的 AuthService 函数?如果我确实需要更新功能,如何访问我的云功能的三个信息详细信息的常量?谢谢。

云函数

exports.createStripeCustomer = functions.https.onCall( async (data, context) => {

    const email = data.email
    const uid = context.auth.uid
  
    if (uid === null) {
      console.log('Illegal access attempt due to unauthenticated attempt.')
      throw new functions.https.HttpsError('internal', 'Illegal access attempt')
    }
  
    return stripe.customers.create({
       email : email
    }).then( customer => {
      return customer["id"]
    }).then( customerId => {
      admin.database().ref("customers").child(uid).set(
        {
          stripeId: customerId,
          email: email,
          id: uid
        }
      )
    }).catch( err => {
      throw new functions.https.HttpsError('internal', 'Unable to create Stripe customer.')
    })
  
})

exports.updateCustomer = functions.database.ref("customers/{id}").onUpdate( (change, context) => {

    

})

AuthService

struct CustomerCredentials {
    let email: String
    let password: String
    let fullname: String
    let username: String
    let profileImage: UIImage
}

static func createCustomer(credentials: CustomerCredentials, completion: @escaping(DatabaseCompletion)) {
        
        guard let imageData = credentials.profileImage.jpegData(compressionQuality: 0.3) else { return }
        let filename = NSUUID().uuidString
        let storageRef = CUSTOMER_PROFILE_IMAGES.child(filename)
        
        storageRef.putData(imageData, metadata: nil) { meta, error in
            storageRef.downloadURL { url, error in
                guard let profileImageUrl = url?.absoluteString else { return }
                
                Auth.auth().createUser(withEmail: credentials.email, password: credentials.password) { result, error in
                    if let error = error {
                        debugPrint(error.localizedDescription)
                        return
                    }
                    
                    guard let uid = result?.user.uid else { return }
                    
                    let values = ["email" : credentials.email,
                                  "uid" : uid,
                                  "fullname" : credentials.fullname,
                                  "username" : credentials.username,
                                  "profileImageUrl" : profileImageUrl]
                    
                    REF_CUSTOMERS.child(uid).setValue(values, withCompletionBlock: completion)
                }
            }
        }
        
}

注册函数

@objc func handleCreateAccount() {
        
        guard let profileImage = profileImage else {
            self.simpleAlert(title: "Error", msg: "Please select a profile image.")
            return
        }
        
        guard let fullname = fullnameTextField.text , fullname.isNotEmpty ,
            let username = usernameTextField.text?.lowercased() , username.isNotEmpty ,
            let email = emailTextField.text?.lowercased() , email.isNotEmpty ,
            let password = passwordTextField.text , password.isNotEmpty ,
            let confirmPassword = confirmPasswordTextField.text , confirmPassword.isNotEmpty else {
                self.simpleAlert(title: "Error", msg: "Please fill out all fields.")
                return
        }
        
        if password != confirmPassword {
            simpleAlert(title: "Error", msg: "Passwords do not match, please try again.")
        }
        
        showLoader(true, withText: "Registering Account")
        
        let credentials = CustomerCredentials(email: email, password: password, fullname: fullname,
                                              username: username, profileImage: profileImage)
        
        AuthService.createCustomer(credentials: credentials) { error, ref in
            if let error = error {
                Auth.auth().handleFireAuthError(error: error, vc: self)
                self.showLoader(false)
                return
            }
            
            Functions.functions().httpsCallable("createStripeCustomer").call(["email" : email]) { result, error in
                if let error = error {
                    Auth.auth().handleFireAuthError(error: error, vc: self)
                    self.showLoader(false)
                    return
                }
            }
            
            self.showLoader(false)
            guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }
            guard let tab = window.rootViewController as? MainTabController else { return }
            tab.setupNavigationControllers()
            self.dismiss(animated: true, completion: nil)
        }
        
}

数据库参考

【问题讨论】:

  • 如果您使用Auth.auth() 创建帐户,他们在哪里登录?
  • 他们使用Auth.auth().signIn在登录控制器上登录
  • 我很难理解这里有什么问题,您是否收到任何错误?
  • @Barraguesh,我无法将全名、用户名和个人资料图片保存到我的参考资料中。就像我的云功能正在取消我的 AuthService 功能中的所有内容。
  • 已检查日志以了解可能拒绝它的原因?我建议检查受影响函数的回复是什么,看看服务器在说什么,如果事情不正常,一定是某个地方存在错误。

标签: swift firebase-realtime-database google-cloud-functions


【解决方案1】:

首先,我希望我明白你的意思。

您不需要云功能添加和更新某些用户的个人信息。我认为您应该将用户的个人信息存储在 Firestore 数据库中。

用户已经注册。 userUID 存在是因为用户已登录。在 Firestore 数据库中创建一个集合,并将集合名称设为用户的 userUID。在 Collection 下创建文档,并在其中保存用户的个人信息。这样,每个用户都可以更新他们的个人信息。这里重要的一点是您必须从规则中设置访问权限。其他用户不应访问其他人的信息。

数据写入、读取和更新代码可以在 Firebase 文档中找到。

如果您使用 Firestore 数据库,用户可以根据您编写的代码删除、添加和更新他们的信息。如果您想更改用户信息,建议您搜索 Firebase Admin。

如果我理解有误,或者您认为缺少信息,请在评论中告诉我。

【讨论】:

  • 我明白你的意思,但我遇到了麻烦,因为我正在使用云功能为客户分配 stripeID。所以我的全名、用户名或个人资料图片没有被分配
猜你喜欢
  • 2021-10-04
  • 2023-03-11
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2021-11-29
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多