Skip to content

Latest commit

 

History

History
579 lines (422 loc) · 15.3 KB

File metadata and controls

579 lines (422 loc) · 15.3 KB

Clase 8

Firebase

FirebaseLogo

Aprendiendo con Firebase 2.x

Primeros pasos

  • Crear una cuenta:

  • Gestionar dependéncias en cliente:

  <script src="https://cdn.firebase.com/js/client/2.2.9/firebase.js"></script>
  • Gestionar dependéncias en Nodejs:
  npm install firebase -save

Limitaciones

Guardando Datos

  • Guardando datos en Firebase

  • set() Almacena / remplaza los datos

  • update() Actualiza los datos

  • push() Alamacena los datos con un ID único.

  • transaction() Para datos complejos y cocurridos.

  • set():

  var ref = new Firebase("https://<<---URL--->>.firebaseio.com/fb-ejemplos/escritura");
  var usersRef = ref.child("users");
  usersRef.set({
    alanisawesome: {
      date_of_birth: "June 23, 1912",
      full_name: "Alan Turing"
    },
    gracehop: {
      date_of_birth: "December 9, 1906",
      full_name: "Grace Hopper"
    }
  });
  var ref = new Firebase("https://<<---URL--->>.firebaseio.com/fb-ejemplos/escritura");
  usersRef.child("alanisawesome").set({
    date_of_birth: "June 23, 1912",
    full_name: "Alan Turing"
  });
  usersRef.child("gracehop").set({
    date_of_birth: "December 9, 1906",
    full_name: "Grace Hopper"
  });
  • update():
  var hopperRef = usersRef.child("gracehop");
  hopperRef.update({
    "nickname": "Amazing Grace"
  });
  • push():
// update y Callback
  var dataRef = ref.child("IDs");
  dataRef.push("Guardando datos...", function(error) {
    if (error) {
      console.warn("No se han podido guardar los datos." + error);
    } else {
      console.info("Datos guardados con exito.");
    }
  });

Eventos

  • Evento (value):
  var ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts");
  
  ref.on("value", function(snapshot) {
    console.log(snapshot.val());
  }, function (errorObject) {
    console.log("Fallo en lectura de datos: " + errorObject.code);
  });
  • Evento (child_changed):
  var ref = new Firebase("https://<<--URL-->>.firebaseio.com/fb-ejemplos/escritura/users");
  
  ref.on("child_changed", function(snapshot) {
    var usersData = snapshot.val();
    console.log("Nuevos cambios(child_changed): ", usersData);
  });
  • Evento (child_removed):
  var ref = new Firebase("https://<<--URL-->>.firebaseio.com/fb-ejemplos/escritura/users");
  
  ref.on("child_removed", function(snapshot) {
    var usersData = snapshot.val();
    console.log("Usuario eliminado(child_removed): ", usersData);
  });
  • once() una vez:
var ref = new Firebase("https://<<--URL-->>.firebaseio.com/fb-ejemplos/escritura/users");

ref.once("child_changed", function(snapshot) {
  var usersData = snapshot.val();
  console.log("Nuevo cambio(once - child_changed): " + usersData);
});
  • Quitar evento (value):
  ref.off("value");
  • Quitar todos los eventos:
  ref.off();

Queries

  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByChild("height").on("child_added", function(snapshot) {
    console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall");
  });
  • orderByKey():
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByKey().on("child_added", function(snapshot) {
    console.log(snapshot.key());
  });
  • orderByValue():
  var scoresRef = new Firebase("https://dinosaur-facts.firebaseio.com/scores");
  scoresRef.orderByValue().on("value", function(snapshot) {
    snapshot.forEach(function(data) {
      console.log("The " + data.key() + " dinosaur's score is " + data.val());
    });
  });

Queries Avanzadas

  • limitToFirst() desde el primero...
  • limitToLast() desde el final...
  • startAt() empiezan por...
  • endAt() terminan por...
  • equalTo() igual a...

Queries Avanzadas (básicos)

  • limitToFirst():
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByChild("height").limitToFirst(2).on("child_added", function(snapshot) {
    console.log(snapshot.key());
  });
  • limitToLast():
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByChild("weight").limitToLast(2).on("child_added", function(snapshot) {
    console.log(snapshot.key());
  });

Queries Avanzadas (concatenando)

  • .orderByValue() y .limitToLast():
  var scoresRef = new Firebase("https://dinosaur-facts.firebaseio.com/scores");
  scoresRef.orderByValue().limitToLast(3).on("value", function(snapshot) {
    snapshot.forEach(function(data) {
      console.log("The " + data.key() + " dinosaur's score is " + data.val());
    });
  });
  • .orderByChild() y .startAt():
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByChild("height").startAt(3).on("child_added", function(snapshot) {
    console.log(snapshot.key());
  });
  • .orderByKey() y .endAt():
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByKey().endAt("pterodactyl").on("child_added", function(snapshot) {
    console.log(snapshot.key());
  });
  • .startAt() y .endAt() usando tilde:
var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
ref.orderByKey().startAt("b").endAt("b~").on("child_added", function(snapshot) {
  console.log(snapshot.key());
});
  • .equalTo():
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.orderByChild("height").equalTo(25).on("child_added", function(snapshot) {
    console.log(snapshot.key());
  });
  • Ejemplo: Busquemos un dinosaurio que sea mas pequeño que un Stegosaurus
  var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
  ref.child("stegosaurus").child("height").on("value", function(stegosaurusHeightSnapshot) {
    var favoriteDinoHeight = stegosaurusHeightSnapshot.val();
  
    var queryRef = ref.orderByChild("height").endAt(favoriteDinoHeight).limitToLast(2)
    queryRef.on("value", function(querySnapshot) {
        if (querySnapshot.numChildren() == 2) {
          // Data is ordered by increasing height, so we want the first entry
          querySnapshot.forEach(function(dinoSnapshot) {
            console.log("el dinosaurio más pequeño que el Stegosaurus es " + dinoSnapshot.key());
  
            // Returning true means that we will only loop through the forEach() one time
            return true;
          });
        } else {
          console.log("El Stegosaurus es el dinosaurio más pequeño");
        }
    });
  });

Trabajar Offline

  var presenceRef = new Firebase('https://<<--URL-->>.firebaseio.com/info/connectednow');
  presenceRef.onDisconnect().set("I disconnected!");
  

Social Login

Seguridad y Autorización

Deploy

Analicemos Código

new_logo funcionalidades

Más info

Claves del cambio

  • Nueva Interfaz
  • Muchas funcionalidades Nuevas
  • Un enfoque amplio a desarrollo de apps nativas (Android e iOS)
  • Existe un asistente para migrar los proyectos a la nueva consola
  • Los nuevos proyectos ya no componen el nombre del dominio

Migración de FIrebase 2.x a 3.x

Nueva versión de las librerías

  • Cliente
  <!-- Antes -->
  <script src="https://cdn.firebase.com/js/client/2.3.2/firebase.js"></script>
  <!-- Ahora -->
  <script src="https://www.gstatic.com/firebasejs/3.0.4/firebase.js"></script>
  • NPM
  npm uninstall firebase --save
  npm install firebase --save

Obtener una referencia de la base de datos

  • Antes
  var ref = new Firebase("https://databaseName.firebaseio.com");
  • Ahora
// See https://firebase.google.com/docs/web/setup#project_setup for how to auto-generate this config
  var config = {
    apiKey: "apiKey",
    authDomain: "projectId.firebaseapp.com",
    databaseURL: "https://databaseName.firebaseio.com"
  };
  
  firebase.initializeApp(config);
  
  var rootRef = firebase.database().ref();

Los métodos de obtención sin argumento son propiedades solo de lectura

  • Antes
// Reference
  var key = ref.key();
  var rootRef = ref.root();
  var parentRef = ref.parent();

// Query
  var queryRef = query.ref();

// DataSnapshot
  ref.on("value", function(snapshot) {
    var dataRef = snapshot.ref();
    var dataKey = snapshot.key();
  });
  • Ahora
// Reference
  var key = ref.key;
  var rootRef = ref.root;
  var parentRef = ref.parent;

// Query
  var queryRef = query.ref;

// DataSnapshot
  ref.on("value", function(snapshot) {
    var dataRef = snapshot.ref;
    var dataKey = snapshot.key;
  });

Actualización de tu código de autenticación

  • Antes
  ref.authWithOAuthPopup("twitter", function(error, authData) {
    if (error) {
      // An error occurred
      console.error(error);
    } else {
      // User signed in!
      var uid = authData.uid;
    }
  });
  • Ahora
  var auth = firebase.auth();
  
  var provider = new firebase.auth.TwitterAuthProvider();
  auth.signInWithPopup(provider).then(function(result) {
    // User signed in!
    var uid = result.user.uid;
  }).catch(function(error) {
    // An error occurred
  });

Obtener el token de acceso

  • Antes
  ref.onAuth(function(authData) {
    if (authData) {
      var accessToken = authData.providerData[authData.provider].accessToken;
    }
  });
  • Ahora
  var auth = firebase.auth();
  
  var provider = new firebase.auth.GoogleAuthProvider();
  auth.signInWithPopup(provider).then(function(result) {
    var accessToken = result.credential.accessToken;
  });

Controlar el estado de autenticación

  • Antes
  ref.onAuth(function(authData) {
    if (authData) {
      // User signed in!
      var uid = authData.uid;
    } else {
      // User logged out
    }
  });
  • Ahora
  var auth = firebase.auth();
  
  auth.onAuthStateChanged(function(user) {
    if (user) {
      // User signed in!
      var uid = user.uid;
    } else {
      // User logged out
    }
  });

Ejercicios

1 - Crea un nuevo formulario que nos permita registrarnos en Firebase.

Objetivos:

  • Comprobar si ese mismo usuario ya esta registrado (Email como ID), para evitar multiples inscripciones.
  • Incluiremos en la página los usuarios que se van sumando.

Solución:

2 - Partiendo del ejercicio anterior... realizaremos un nuevo formulario que nos permita registrarnos usando nuestra cuenta de Github.

  • Objetivos Opcionales:

    • Subir los datos proporcionados por Github a nuestra base de datos.
    • Incluir parte de los datos como el avatar y el nombre del usuario en el html
  • Documentación:

Solución: