Скачать из Firebase как JSON с помощью JavaScript

Я хочу экспортировать объект Firebase из JavaScript как JSON и загрузить его. Например, этот предмет, который есть в ссылке patients/. Я хотел бы загрузить его в виде файла .json в таком формате:

"-LCZPCkiGCNhFaQ8ckJ-" : {
  "altura" : 165,
  "apellido" : "Salas",
  "extra" : {
    "Jubilado" : "No",
    "Localidad" : "Madrid",
    "Telefono" : "698532147"
  },
  "fechaNacimiento" : "14/10/1961",
  "nombre" : "Paquita",
  "sexo" : "Mujer"
}

Мне удалось загрузить только файл, хранящийся в хранилище, но не в базе данных реального времени.

 firebase.storage().ref('grabaciones/').child(grabacion).getDownloadURL().then(function (url) {
  let a = document.createElement("a");
  a.download = grabacion;
  a.href = url;
  document.body.appendChild(a);
  a.click();
}).catch(function (error) {
  // Handle any errors
  console.info(error);
});

Заранее спасибо.

Обновленный код, в котором элемент получается как JSON и загружается как .json. Работает только в Firefox:

$scope.exportarJSON = function (paciente) {
        console.info(grabacion);
        firebase.database().ref('pacientes/').child(pacinte).once('value', function (paciente) {
          download(paciente + ".json", JSON.stringify(paciente.val()));
        });
    };



 function download(filename, text) {
    var element = document.createElement('a');
    element.setAttribute('href', 'data:text/json;charset=utf-8,' + encodeURIComponent(text));
    element.setAttribute('download', filename);

    element.style.display = 'none';
    document.body.appendChild(element);

    element.click();

    document.body.removeChild(element);
  }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
3 218
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать вызываемую функцию следующим образом:

Код облачной функции (index.js)

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

admin.initializeApp();

exports.getJSON = functions.https.onCall((data, context) => {

    return admin.database().ref('yourLocation').once('value')
        .then(function(snapshot) {
            return snapshot.val();
    });

    //Note that yourLocation is hardcoded in this example but could be obtained from 
    //the data parameter, which value comes from the JavaScript call in your web page    

});

Код на веб-странице, например:

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <title>Title</title>

    <script src = "https://www.gstatic.com/firebasejs/5.0.3/firebase-app.js"></script>
    <script src = "https://www.gstatic.com/firebasejs/5.0.3/firebase-auth.js"></script>
    <script src = "https://www.gstatic.com/firebasejs/5.0.3/firebase-functions.js"></script>

</head>
<body>

<script>

    // Initialize Firebase
    var config = {
        apiKey: "....",
        authDomain: "",
        databaseURL: "",
        projectId: ""
    };

    firebase.initializeApp(config);

    var getJSON = firebase.functions().httpsCallable('getJSON');
    getJSON().then(function(result) {
        console.info(JSON.stringify(result.data));
    }).catch(function(error) {
        // Getting the Error details.
        var code = error.code;
        var message = error.message;
        var details = error.details;
        // ...
    });

</script>


</body>
</html>

Вы можете найти документ о вызываемых функциях здесь: https://firebase.google.com/docs/functions/callable

Обратите внимание, что вы можете вызывать эту функцию из приложений iOS или Android.

Вы можете сделать что-то подобное с простой облачной функцией HTTPS и вызвать ее как конечную точку REST API (например, с библиотекой Axios). Одним из преимуществ использования вызываемой функции является то, что «аутентификация Firebase и токены FCM автоматически включаются в запросы», поэтому вы можете легко ограничить вызовы только авторизованным пользователям.

Хорошо, думаю, я понял идею. Я попытался реализовать его, не прибегая к функциям Firebase, и, похоже, он работает, я добавил его к вопросу. Я также добавил функцию загрузки, чтобы загрузить файл как .json, как описано в этот вопрос, но я получаю его только работать в Firefox. Часть загрузки будет отсутствовать в вашем коде. Спасибо за Ваш ответ

asierta 18.05.2018 14:04

Каждый фрагмент данных в вашей базе данных Firebase имеет свой уникальный URL-адрес. Например, я быстро импортировал ваши образцы данных в одну из своих баз данных, и теперь они находятся на https://stackoverflow.firebaseio.com/50408054/-LCZPCkiGCNhFaQ8ckJ-.

Если вы перейдете по этому URL-адресу, вам будет предложено войти в систему. Поскольку у вас нет доступа к моему проекту, вы не можете увидеть мою консоль базы данных.

Но вы может обращаетесь к данным как JSON. Поскольку я предоставил публичный доступ для чтения к данным, вы можете получить к ним доступ как к JSON по этому URL-адресу: https://stackoverflow.firebaseio.com/50408054/-LCZPCkiGCNhFaQ8ckJ-.json. Как видите, это тот же URL-адрес, что и раньше, но теперь с добавлением .json в конце.

Это часть REST API Firebase, которая полностью задокументирована здесь: https://firebase.google.com/docs/database/rest/start. Вы должны иметь возможность использовать этот URL-адрес REST в своей ссылке для загрузки, если данные доступны для всеобщего чтения.

Спасибо за ответ, но мне нужна информация, недоступная публично. Мне удалось это сделать, следуя стратегии @RenaudTarnec, как вы можете видеть в ответе, но спасибо за интересную информацию.

asierta 19.05.2018 11:07

Я считаю, что ссылка изменилась на: firebase.google.com/docs/database/rest/start

DavidTaubmann 20.06.2019 06:13
Ответ принят как подходящий

Наконец, мне удалось это сделать, получив данные из Firebase и применив к ним JSON.stringify (). Позже, чтобы загрузить их как файл .json, я создал Blob со строкой, следующей за кодом этот вопрос. Спасибо за ответы, они вдохновляли

 $scope.exportarJSON = function (paciente) {
        console.info(grabacion);
        firebase.database().ref('pacientes/').child(pacinte).once('value', function (paciente) {
          download(paciente + ".json", paciente.val());
        });
    };


function download(filename, paciente) {
    let file = JSON.stringify(paciente);
    let blob = new Blob([file], {type: "application/json"});
    let url  = URL.createObjectURL(blob);
    let element = document.createElement('a');
    element.setAttribute('href', url);
    element.setAttribute('download', paciente.nombre + ".json");

    element.style.display = 'none';
    document.body.appendChild(element);

    element.click();

    document.body.removeChild(element);
  }

Другие вопросы по теме