Облачная функция Firebase возвращает ВНУТРЕННЮЮ ошибку

1

Я получаю ошибку как INTERNAL при вызове облачной функции Firebase из моего приложения.

Код сервера:

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, переданного в функцию.

Как получить доступ к свойствам переданных свойств объекта?

Теги:
firebase
google-cloud-functions

1 ответ

0

Вы вызываете свою функцию со String, но обращаетесь к ней как к JSONObject.

Документация для call() показывает, что он принимает диапазон типов, включая String, Map<String,?> И JSONObject. Это дает вам несколько вариантов передачи продукта и доступа к нему в вашей функции.

  1. Как и сейчас, преобразуйте элемент питания в строку JSON и передайте строку. В коде функции необходимо преобразовать строку в объект с const food = JSON.parse(data) перед доступом к полям, например food.foodItem.name.

  2. Если у Food мало полей, вы можете поместить каждое поле в свой objectHashMap и передать карту без преобразования в JSON. Затем в коде вашей функции вы можете получить доступ к каждому полю без необходимости использовать JSON.parse().

  • 0
    Пришел на то же решение (JSON parse), забыл обновить здесь. Спасибо за ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню