Javascript Firebase functions.https.onCall返回空值

Javascript Firebase functions.https.onCall返回空值,javascript,android,node.js,firebase,google-cloud-functions,Javascript,Android,Node.js,Firebase,Google Cloud Functions,我在node.js中编写了以下firebase cloud函数,我在Android应用程序中调用了该函数。该函数工作正常,但在尝试在Android中获取结果时,该函数为null。我需要返回到我的android应用程序控制台.logresult.data;行,但该行在firebase函数完全完成后调用,所以我的Android应用程序将为空 index.js 这是我的subcheck.js 这是我的firebase功能控制台日志: 我试图通过以下方法在Android中获得结果: privat

我在node.js中编写了以下firebase cloud函数,我在Android应用程序中调用了该函数。该函数工作正常,但在尝试在Android中获取结果时,该函数为null。我需要返回到我的android应用程序控制台.logresult.data;行,但该行在firebase函数完全完成后调用,所以我的Android应用程序将为空

index.js

这是我的subcheck.js

这是我的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();
                }
            });
}

问题很可能来自以下事实:您没有在中返回调用verifySubscription函数的结果:

exports.subcheck = functions.https.onCall((data, context) => {
    subcheck.verifySubscription(data, context);
});
你应该做:

exports.subcheck = functions.https.onCall((data, context) => {
    return subcheck.verifySubscription(data, context);
});
此外,您可能应该按如下方式重新组织承诺链,以避免将调用嵌套到then,请参阅更多详细信息/解释


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

在case result.status===200与否的情况下,您似乎返回了相同的结果。这真的是你的意图吗?不使用`console.logresult.data;记录正确的值?另外,您可以添加用于从应用程序调用云函数的代码吗?对不起,这是一个复制粘贴问题。console.logresult.data记录正确的值。我将添加控制台日志截图和我的android通话。
exports.subcheck = functions.https.onCall((data, context) => {
    subcheck.verifySubscription(data, context);
});
exports.subcheck = functions.https.onCall((data, context) => {
    return subcheck.verifySubscription(data, context);
});
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);
        });

}