Получение возвращенных данных из вызываемых функций Firebase - PullRequest
0 голосов
/ 24 апреля 2018

Я играю с вызываемыми HTTPS-функциями в iOS. Я создал и развернул следующую функцию:

export const generateLoginToken = functions.https.onCall((data, context) => {

    const uid = data.user_id
    if (!(typeof uid === 'string') || uid.length === 0) {
        throw new functions.https.HttpsError('invalid-argument', 'The function must be called with one argument "user_id" ');
    }

    admin.auth().createCustomToken(uid)
    .then((token) => {
        console.log("Did create custom token:", token)
        return { text: "some_data" };
    }).catch((error) => {
        console.log("Error creating custom token:", error)
        throw new functions.https.HttpsError('internal', 'createCustomToken(uid) has failed for some reason')
    })
})

Затем я вызываю функцию из моего iOS-приложения следующим образом:

let callParameters = ["user_id": userId]
    self?.functions.httpsCallable("generateLoginToken").call(callParameters) { [weak self] (result, error) in
    if let localError = self?.makeCallableFunctionError(error) {
        single(SingleEvent.error(localError))
    } else {
        print("Result", result)
        print("data", result?.data)
        if let text = (result?.data as? [String: Any])?["text"] as? String {
            single(SingleEvent.success(text))
        } else {
            let error = NSError.init(domain: "CallableFunctionError", code: 3, userInfo: ["info": "didn't find custom access token in the returned result"])
            single(SingleEvent.error(error))
        }
    }
}

Я вижу в журналах, что функция вызывается на сервере с правильными параметрами, но я не могу понять, какие данные возвращаются из функции обратно в приложение. Кажется, что значение result.data по какой-то причине равно nil, хотя я return {text: "some_data"} из облачной функции. Как получилось?

1 Ответ

0 голосов
/ 25 апреля 2018

Хлоп!Проблема заключалась в том, что я забыл вернуть реальное обещание из облачной функции.Эта функция работает:

export const generateLoginToken = functions.https.onCall((data, context) => {

    const uid = data.user_id
    if (!(typeof uid === 'string') || uid.length === 0) {
        throw new functions.https.HttpsError('invalid-argument', 'The function must be called with one argument "user_id" ');
    }

    return admin.auth().createCustomToken(uid)
    .then((token) => {
        console.log("Did create custom token:", token)
        return { text: "some_data" };
    }).catch((error) => {
        console.log("Error creating custom token:", error)
        throw new functions.https.HttpsError('internal', 'createCustomToken(uid) has failed for some reason')
    })
})
...