Функция iOS в облаке и обратно - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь интегрировать приложение iOS Swift с облачными функциями с помощью onCall.Однако мой простой сервис отказывается отправлять данные обратно.

Вот моя функция:

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

    var public_token = data.public_token;


    if (!(typeof public_token === 'string') || public_token.length === 0) {
        // Throwing an HttpsError so that the client gets the error details.
        throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' +
            'one arguments "text" containing the message text to add.');
    }


    const docRef = admin.firestore().doc(`/PlaidUsers/` + public_token);

    docRef.get().then(function(doc) {

        if (doc.exists) {
            return {"text" : "test"};

        } else {
            return {"text" : "Document doesn't exist"};
        }

    }).catch(error => {
        return {"text" : "Error getting document"};

    });

});

Он успешно развертывается в облачных функциях

Вот мой простой Swiftкод:

 self.functions.httpsCallable("getText").call(["public_token" : self.userMap["plaidPublicToken"]]) { (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(message)
                        }
                        // ...
                    }
                    if let text = (result?.data as? [String: Any])?["text"] as? String {
                        print (text)
                    }
                }

Я не получаю ошибки, только нулевой результат.

1 Ответ

0 голосов
/ 03 февраля 2019

В JavaScript then и catch являются асинхронными методами обратного вызова.Вы не можете вернуть данные из них, которые будут возвращены содержащей функцией.Ваша функция действительно ничего не возвращает обратно клиенту, потому что на верхнем уровне функции нет оператора возврата.

then и catch оба возвращают другое обещание, которое разрешается со значением, возвращаемым ихметоды обратного вызова.Поэтому попробуйте поставить возврат на верхнем уровне цепочки обещаний:

return docRef.get().then(...).catch(...)
...