Как превратить ответ Firebase REST API в массив в машинописном тексте? - PullRequest
5 голосов
/ 07 августа 2020

У меня сейчас проблема с обработкой данных ответа, которые я отправил в свою базу данных firebase в реальном времени с помощью REST в моем приложении Angular. Просто предисловие: буду честен. Я медленно изучаю как angular, так и firebase.

У меня есть дочерний маршрут в моей базе данных под названием «отложенные заказы»

https://i.imgur.com/C1EXaEi.png

Каждый уникальный идентификатор соответствует зарегистрированному пользователю, который сделал заказ на покупку в то время.

Чтобы получить все мои отложенные заказы, я отправляю HTTP-запрос GET в свою базу данных, конечная точка находится в ожидании -orders. json точно так же, как предлагает документация firebase.

Это дает мне ответ, который, как я предполагал, должен был быть массивом. Но вместо этого есть объект с вложенными объектами. Я зарегистрировал ответ:

{G2v12VlKwNPXwtUDV4g41PIqHZx1: {…}, hYgflcf7WGR6wLrCPkAL1B4MbZI3: {…}}

Но мне нужен массив, содержащий дочерние элементы (значения ключей в этом объекте ответа). Я не совсем уверен, как его получить. Как можно go добиться этого?

В стороне ...

На самом деле, я даже не уверен, как бы я go извлекал дочерний узел, чей уникальный ID был сгенерирован самой firebase (через запрос POST).

Если я не пропустил что-то в документации по REST API, они описывают, как вновь вставленные дочерние узлы получают свой собственный уникальный идентификатор через запросы POST, но позже не не обсуждаю, как получить доступ к этим дочерним узлам в частности или через коллекции (как я пытаюсь это сделать). Насколько мне известно, у клиента нет возможности узнать эти уникальные идентификаторы (или пользовательские идентификаторы, которые я создал сам).

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Поскольку TypeScript - это просто JavaScript, вы можете делать такие вещи, как:

const pendingOrdersResponse = await firebase.handwaving.pendingOrders();
const pendingOrdersTransformed = Object.keys(pendingOrdersResponse).map(id => {
  return { uuid: id, ...pendingOrdersResponse[id] };
});

Тогда pendingOrdersTransformed будет массивом с вашими данными в виде простых-старых- JavaScript объектов в массиве и сгенерированный идентификатор в виде поля uuid для каждого pendingOrder в массиве.

0 голосов
/ 07 августа 2020

Продолжая комментарий Джея Кодиста, я сделал следующее, чтобы создать свой собственный массив ProcessedOrders на основе данных ответа, которые я получаю от firebase. Решение, которое я придумал, выглядит следующим образом:

fetchPurchaseOrders(): void {
this.http
  .get('https://APP-NAME.firebaseio.com/pending-orders.json')
  .subscribe((res) => {
    if (res) {
      const processedOrders: ProcessedOrder[] = [];
      for (const [key, value] of Object.entries(res)) {
        processedOrders.push(value as ProcessedOrder);
      }
      console.log(processedOrders);
    }
  });

}

Это позволяет мне сохранять заказы, не заботясь о пользовательском идентификаторе, который я установил для каждого дочернего узла в базе данных. Имеющийся там console.log () позволяет мне распечатать все заказы, как я хотел. Это означает, что теперь массив ProcessedOrders можно использовать в приложении, как я хочу.

Я не могу не задаться вопросом, что, возможно, я испортил свою структуру данных, не продумав ее должным образом. Этот подход будет отличным, если я просто хочу видеть заказы, но не настолько, если я хочу обновить какую-либо информацию о них с административной стороны, поскольку мне все равно придется полагаться на индивидуальный идентификатор, который я им изначально дал.

Я мог бы также потратить время на изучение AngularFire, как предлагали другие комментаторы. Может, это будет лучше и проще, чем REST API.

В любом случае. Проблема была решена, так как первоначальная цель моего вопроса заключалась в том, как превратить ответ в массив.

Спасибо всем, кто пытается помочь!

...