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