Облачная функция Firebase возвращает ВНУТРЕННЮЮ ошибку - PullRequest
1 голос
/ 13 апреля 2019

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

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

1 Ответ

1 голос
/ 13 апреля 2019

Вы вызываете свою функцию с String, но получаете доступ к ней как JSONObject.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...