Как ссылаться на детей из нескольких детей с помощью json-response - PullRequest
0 голосов
/ 03 февраля 2019

Я сейчас пытаюсь получить данные моего firebase-realtime-database, используя axios для моего react-native приложения.Цель состоит в том, чтобы в моем приложении было несколько карт со значениями «широта», «долгота», «имя», «цена» и изображение на них.Для рендеринга карт я использую функцию карты.

Я написал google-cloud-functions для получения данных из моей базы данных:

const admin = require('firebase-admin');

module.exports = function(req, res) {
  admin.database().ref('locations/').on('value', function(snapshot) {
    res.send(snapshot.val());
  }, err => res.send({ error: err }));
}

, который отвечает следующим образом:

{
     "-LXd6BopD1onEMc--1qS": {
        "latitude": xxxx,
        "longitude": xxxx,
        "name": "xxxx",
        "price": "xxx",
        "url": "xxxxx"
    },
    "-LXd7GokGQqkxkhDXJBd": {
        "latitude": xxxx,
        "longitude": xxxx,
        "name": "xxxx",
        "price": "xxxx",
        "url": "xxxxxx"
    },
}

Ключ / имя дочернего элемента в основном неизвестны, так как я использую «push» для помещения данных в базу данных, которая создает уникальные ключи для каждой записи.

В настоящее время я используюэто позволяет получить доступ к данным, но, к сожалению, «данные» всегда неопределены.

let { data } = await axios.get(`${ROOT_URL}/getValues`)

Поэтому у меня есть два вопроса:

  1. Почему «данные» не определеныи как я могу это исправить?

  2. Если первый вопрос решен, как я могу получить данные от обоих детей, так как я не знаю явно их ключи.Как мне ссылаться на них?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Итак, для второго вопроса JSON, который вы получаете, выглядит как

{
     "-LXd6BopD1onEMc--1qS": {
        "latitude": xxxx,
        "longitude": xxxx,
        "name": "xxxx",
        "price": "xxx",
        "url": "xxxxx"
    },
    "-LXd7GokGQqkxkhDXJBd": {
        "latitude": xxxx,
        "longitude": xxxx,
        "name": "xxxx",
        "price": "xxxx",
        "url": "xxxxxx"
    },
}

Ключи, сгенерированные firebase, равны -LXd6BopD1onEMc--1qS, и ваш объект данных против этих ключей.

Получите объект данных, который вы должны ссылаться на ваши данные, используя ключ.

предположим, что полученный вами JSON находится в переменной data, тогда либо вы можете использовать Object.keys и Object.entries получить ключи и ваш объект данных из переменной data.Или вы можете использовать "for in" loop

var data = {....}  // this data variable holds the json response you received

for (var key in data) {
  var myObj = data[key];
  console.log(myObj);        // object of your data
  console.log(myObj.name);   // name
  console.log(myObj.price);  // price
}

Также помните, что вы можете ссылаться на клавиши двумя способами

или myObj.name или myObj['name'] в зависимости отНазвание ваших ключей.Второй полезен, когда ваши ключи не являются допустимыми именами переменных javascript.

Для Первый вопрос было бы неплохо, если вы предоставите запрос, фрагменты кода ответа.

В противном случае эта строка

let { data } = await axios.get(`${ROOT_URL}/getValues`)

в вашем вопросе должна технически работать нормально, если URL-адрес правильный, или иным образом использовать try catch вокруг него и перехватывать и регистрировать ошибку или пытаться утешить полученный ответ.

0 голосов
/ 03 февраля 2019

1.- await axios.get('${ROOT_URL}/getValues') этот код возвращает обещание, поэтому вам все еще нужно разрешить это обещание, чтобы получить от него данные

2.- Когда вы получите данные обратно, вы можете выполнить их итерациюс Object.keys или Object.entries.Смотрите фрагмент кода

Надеюсь, это поможет

async function request(){
return  await axios.get('https://jsonplaceholder.typicode.com/posts/1');
}

async function makeRequest() {

const {data} = await request(); // this line resolves the promise
console.log(data);

}

makeRequest();


const dummyResponse = {
     "-LXd6BopD1onEMc--1qS": {
        "latitude": 'xxxx',
        "longitude": 'xxxx',
        "name": "xxxx",
        "price": "xxx",
        "url": "xxxxx"
    },
    "-LXd7GokGQqkxkhDXJBd": {
        "latitude": 'xxxx',
        "longitude": 'xxxx',
        "name": "xxxx",
        "price": "xxxx",
        "url": "xxxxxx"
    },
};

Object.keys(dummyResponse).forEach( key => {console.log(key)})
Object.entries(dummyResponse).forEach( entry => {console.log(entry)})
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...