为什么云函数返回带有值的“ Optional()”

时间:2019-05-24 15:12:06

标签: javascript swift firebase google-cloud-functions

我有一个功能可以检查是否正在使用电子邮件,这是该功能的代码:

UTF-8

如您所见,该函数可以正常工作,它知道是否接收电子邮件,但是它将我的应用返回“ Optional(false)”,而不是“ false”或“ true”。

这是我的Xcode代码:

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
admin.initializeApp()

exports.uniqueEmail = functions.https.onCall((data) => {

  const email = data.email;
  if (!email) {
    console.log('missing email')
    throw new functions.https.HttpsError('invalid-argument', 'Missing email parameter');
  }
  return admin.auth().getUserByEmail(email).then(function(userRecord) {
    console.log('Successfully fetched user data:', userRecord.toJSON());
    return "true"
  }).catch(function(error) {
   console.log('Error fetching user data:', error);
   console.log('Email: ', email)
   return "false"
  });
});

预先感谢

2 个答案:

答案 0 :(得分:1)

得到opcional(true / false,因为)正在打印可选值'?'

您的代码:

print(result?.data)

示例:

let value = false

print("this is a false value: \(value?)")

每次您打印带有“?”的值您会优先选择

答案 1 :(得分:0)

您传递给call()的回调会产生HTTPSCallableResult或错误:

func call(completion: @escaping (HTTPSCallableResult?, Error?) -> Void)

任何一个都可能为nil,这就是为什么在使用它们的值之前必须先两者对其进行检查。您现在正在检查error,但没有检查result,这意味着您得到的Optional需要进一步检查nil。

您应该改用documentation中所述的模式:

functions.httpsCallable("addMessage").call(["text": inputField.text]) { (result, error) in
  if let error = error as NSError? {
    if error.domain == FunctionsErrorDomain {
      let code = FunctionsErrorCode(rawValue: error.code)
      let message = error.localizedDescription
      let details = error.userInfo[FunctionsErrorDetailsKey]
    }
    // ...
  }
  if let text = (result?.data as? [String: Any])?["text"] as? String {
    self.resultField.text = text
  }
}

请注意,错误和成功案例均使用if let