Почему облачные функции возвращают 'Optional ()' со значением - PullRequest
0 голосов
/ 24 мая 2019

У меня есть функция, чтобы проверить, используется электронное письмо или нет, вот код для функции:

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"
  });
});

Как видите, функция работает, она знает, взято письмо или нет, однако возвращает моему приложению «Необязательно (false)» вместо «false» или «true».

Вот мой код Xcode:

IBAction func nextPressed(_ sender: Any) {
        var result = ""
        if(emailInputField.text != ""){
            Functions.functions().httpsCallable("uniqueEmail").call(["email": emailInputField.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]
                    }
                    // ...
                }
                    print(result?.data)
            }

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вы получаете opcional (true / false, потому что) вы печатаете необязательное значение '?'

ваш код:

print(result?.data)

пример:

let value = false

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

каждый раз, когда вы печатаете значение с помощью? сначала вы получите опцион

0 голосов
/ 24 мая 2019

Обратный вызов, который вы передаете call () , выдает либо HTTPSCallableResult, либо ошибку:

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

Любой из них может быть нулем, поэтому вынеобходимо проверить их оба , прежде чем использовать их значения.Вы проверяете error прямо сейчас, но вы не проверяете result, что означает, что вы получаете Необязательный, который нуждается в дополнительных проверках на ноль.

Вместо этого следует использовать шаблон, как описано в документация :

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 используется как в случае ошибки, так и в случае успеха.

...