从我的应用程序调用Firebase Cloud Function时出现错误INTERNAL
。
服务器代码:
exports.addToCart = functions.https.onCall((data, context) => {
// Checking that the user is authenticated.
if (!context.auth) {
// Throwing an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError(
"failed-precondition",
"The function must be called " + "while authenticated."
);
}
// Get data
const food = data.food;
// Get user details
const uid = context.auth.uid;
console.log("User id " + uid);
console.log("Food name " + food.name);
return "Added to cart successfully."
});
Java代码:
addToCartTask(foodItem)
.addOnSuccessListener(s -> {
Log.e(TAG, "Success : " + s);
})
.addOnFailureListener(e -> {
Log.e(TAG, "Error : " + e.getLocalizedMessage());
});
private Task<String> addToCartTask(Food foodItem) {
// Create the arguments to the callable function.
Map<String, Object> objectHashMap = new HashMap<>();
objectHashMap.put("foodItem", foodItem);
Gson gson = new Gson();
String data = gson.toJson(objectHashMap);
return firebaseFunctions
.getHttpsCallable("addToCart")
.call(data);
}
错误归因于访问函数中传递的自定义java对象的属性。
如何访问传递的对象属性的属性?
答案 0 :(得分:1)
您正在使用String
调用函数,但是以JSONObject
的形式访问它。
documentation for call()表明它接受一系列类型,包括String
,Map<String,?>
和JSONObject
。这为您提供了一些传递食物项目并在您的函数中访问它的选项。
像现在一样,将食品项转换为JSON字符串并传递该字符串。在功能代码中,您需要先使用const food = JSON.parse(data)
将字符串转换为对象,然后再访问字段,例如food.foodItem.name
。
如果Food
没有太多字段,则可以将每个字段放入objectHashMap
中并传递地图,而无需转换为JSON。然后,在功能代码中,无需使用JSON.parse()
即可访问每个字段。