【问题标题】:Firebase functions.https.onCall returns nullFirebase 函数。https.onCall 返回 null
【发布时间】:2020-06-03 10:04:04
【问题描述】:

我有以下用 node.js 编写的 firebase 云函数,我从我的 Android 应用程序调用该函数。该函数工作正常,但在尝试在 Android 中获取结果时我得到空值。我需要返回到我的 android 应用程序 console.log(result.data); 行,但是在 firebase 函数完全完成后调用该行,所以我的 Android 应用程序变为空。

index.js

'use strict'

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const subcheck = require('./subcheck');
admin.initializeApp();


exports.subcheck = functions.https.onCall((data, context) => {
    subcheck.verifySubscription(data, context);
});

这是我的 subcheck.js

'use strict'
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const key =  require('./service-account-key.json'); // JSON key file
const {google} = require('googleapis');

const authClient = new google.auth.JWT({
    email: key.client_email,
    key: key.private_key,
    scopes: ["https://www.googleapis.com/auth/androidpublisher"]
});

const playDeveloperApiClient = google.androidpublisher({
    version: 'v3',
    auth: authClient
});

//admin.initializeApp(functions.config().firebase);

exports.verifySubscription = function(data, context) {
    const skuId = data.sku_id;
    const purchaseToken = data.purchase_token;
    const packageName = data.package_name;

    return authClient.authorize()
        .then(function(result) {
            return playDeveloperApiClient.purchases.subscriptions.get({
                packageName: packageName,
                subscriptionId: skuId,
                token: purchaseToken
            }).then(function(result) {
                if (result.status === 200) {
                    console.log(result.data);
                    return {
                        data: result.data,
                        status: 200,
                        message: "Verified Subscription"
                    };
                } else {
                    console.log("Failed to verify subscription, Try again!");
                    return {
                        data: result.data,
                        status: 500,
                        message: "Failed to verify subscription, Try again!"
                    };
                }
            })
            .catch(function(error) {
                console.log(error);
            });

        })
        .catch(function(error) {
            console.log(error);
        });

}

这是我的 firebase 函数控制台日志:

我正在尝试使用以下方法在 Android 中获得结果:

    private Task<String> checkUserSubscribed(PurchaseHistoryRecord purchase) {
    Map<String, Object> mapUserPurchase = new HashMap<>();
    mapUserPurchase.put("sku_id", purchase.getSku());
    mapUserPurchase.put("purchase_token", purchase.getPurchaseToken());
    mapUserPurchase.put("package_name", "xxxxxxx");

    return mFirebaseFunctions
            .getHttpsCallable("subcheck")
            .call(mapUserPurchase)
            .continueWith(new Continuation<HttpsCallableResult, String>() {
                @Override
                public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                    String result = (String) task.getResult().getData();
                    return result;
                }
            }).addOnCompleteListener(new OnCompleteListener<String>() {
                @Override
                public void onComplete(@NonNull Task<String> task) {
                    String result = task.getResult();
                    Toast.makeText(MainActivity.this, "func results: " + result, Toast.LENGTH_SHORT).show();
                }
            });
}

【问题讨论】:

  • 如果result.status === 200 与否,您似乎返回相同的东西。真的是你的本意吗? `console.log(result.data);记录正确的值?另外,您能否添加用于从您的应用调用 Cloud Function 的代码?
  • 抱歉,这是复制粘贴问题。 console.log(result.data) 记录正确的值。我将添加控制台日志截图和我的 android 调用。

标签: javascript android node.js firebase google-cloud-functions


【解决方案1】:

问题很可能是因为您没有将调用结果返回给verifySubscription() 函数:

exports.subcheck = functions.https.onCall((data, context) => {
    subcheck.verifySubscription(data, context);
});

你应该这样做:

exports.subcheck = functions.https.onCall((data, context) => {
    return subcheck.verifySubscription(data, context);
});

此外,您可能应该按如下方式重新组织您的 Promise 链,以避免嵌套对 then() 的调用,请参阅更多详细信息/解释 here

exports.verifySubscription = function(data, context) {
    const skuId = data.sku_id;
    const purchaseToken = data.purchase_token;
    const packageName = data.package_name;

    return authClient.authorize()
        .then(result => {
            return playDeveloperApiClient.purchases.subscriptions.get({
                packageName: packageName,
                subscriptionId: skuId,
                token: purchaseToken
            })
        })
        .then(result => {
                if (result.status === 200) {
                    console.log(result.data);
                    return {
                        data: result.data,
                        status: 200,
                        message: "Verified Subscription"
                    };
                } else {
                    console.log("Failed to verify subscription, Try again!");
                    return {
                        data: result.data,
                        status: 500,
                        message: "Failed to verify subscription, Try again!"
                    };
                }
            })
        })
        .catch(function(error) {
            console.log(error);
        });

}

最后,您可以查看documentation 关于可调用云函数中的错误处理。您可以抛出functions.https.HttpsError 的实例,而不是返回{data: result.data,status: 500, ...};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2018-11-24
    • 1970-01-01
    • 2020-03-03
    • 2021-03-04
    • 2019-02-27
    • 2021-08-15
    相关资源
    最近更新 更多