Firebase函数。https.onCall返回null

问题描述 投票:0回答:1

我有以下从我的Android应用中调用的用node.js编写的firebase云函数。该函数可以正常工作,但尝试在Android中获取结果时却为null。我需要返回到我的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功能控制台日志:

enter image description here

我正在尝试通过以下方法在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();
                }
            });
}
javascript android node.js firebase promise
1个回答
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有关可调用云函数中的错误处理的信息。代替返回{data: result.data,status: 500, ...};,您可以抛出functions.https.HttpsError的实例。

© www.soinside.com 2019 - 2024. All rights reserved.