las líneas
const settings = { timestampsInSnapshots : true}
this.db.settings(settings)
ya no son necesarias puesto que esta configuración ya está por defecto :D
Crear un flujo sólido para insertar datos en Firestore con control de autenticación y manejo de promesas es clave para apps escalables. Aquí verás cómo configurar la instancia, crear un documento con ID automático y usar serverTimestamp del servidor, además de validar el usuario desde Firebase Auth y depurar errores comunes.
Configuración y preparación
Antes de insertar datos, se define en el constructor una variable db que guarda la instancia de Firestore. También se ajustan los settings para que los valores tipo DateTime se recuperen como Timestamp. Esto centraliza el acceso a la base y estandariza las fechas del servidor.
¿Cómo inicializar la base de datos con una instancia de Firestore?
this.db para reutilizarla en varias funciones.// En el constructor this.db = firebase.firestore(); this.db.settings({ timestampsInSnapshots: true });
¿Para qué sirve timestamps in snapshots?
Inserción del documento y manejo de resultados
La creación del post se realiza con collection('post') y add(...). Esto permite que Firestore genere un ID automático. Además, la fecha se asigna desde el servidor con firebase.firestore.FieldValue.serverTimestamp() para evitar desajustes locales.
¿Cómo crear un documento con ID automático e información del post?
add para delegar a Firestore la creación del ID.this.db .collection('post') .add({ uid: uidUsuario, autor: emailUsuario, titulo, descripcion, linkImagen, linkVideo, fecha: firebase.firestore.FieldValue.serverTimestamp() }) .then(ref => { console.log('ID del post:', ref.id); }) .catch(error => { console.error('Error creando el post:', error); });
¿Cómo obtener serverTimestamp del servidor?
FieldValue.serverTimestamp() entrega fecha y hora del servidor.Validación de usuario y prueba en la interfaz
El controlador de post crea la instancia de la clase, valida si el usuario está autenticado y, solo entonces, llama a la función de creación. Se muestran mensajes según el éxito o el error, y se depuran fallos como variables mal nombradas.
¿Cómo validar que el usuario esté autenticado antes de crear el post?
firebase.auth().currentUser.null: informar que debe autenticarse y salir.const user = firebase.auth().currentUser; if (user === null) { // Mostrar alerta: para crear el post debe estar autenticado. return; }
¿Qué campos se envían y cómo se reporta el resultado?
uid del usuario, email, titulo, descripcion, linkImagen, linkVideo.¿Cómo depurar un error común de variables mal nombradas?
emailUser en lugar de autor).¿Te gustaría que ampliemos con lectura en tiempo real y consultas filtradas en Firestore? Deja tus dudas o casos de uso en los comentarios.
Crear un flujo sólido para insertar datos en Firestore con control de autenticación y manejo de promesas es clave para apps escalables. Aquí verás cómo configurar la instancia, crear un documento con ID automático y usar serverTimestamp del servidor, además de validar el usuario desde Firebase Auth y depurar errores comunes.
Antes de insertar datos, se define en el constructor una variable db que guarda la instancia de Firestore. También se ajustan los settings para que los valores tipo DateTime se recuperen como Timestamp. Esto centraliza el acceso a la base y estandariza las fechas del servidor.
this.db para reutilizarla en varias funciones.// En el constructor
this.db = firebase.firestore();
this.db.settings({ timestampsInSnapshots: true });
La creación del post se realiza con collection('post') y add(...). Esto permite que Firestore genere un ID automático. Además, la fecha se asigna desde el servidor con firebase.firestore.FieldValue.serverTimestamp() para evitar desajustes locales.
add para delegar a Firestore la creación del ID.this.db
.collection('post')
.add({
uid: uidUsuario,
autor: emailUsuario,
titulo,
descripcion,
linkImagen,
linkVideo,
fecha: firebase.firestore.FieldValue.serverTimestamp()
})
.then(ref => {
console.log('ID del post:', ref.id);
})
.catch(error => {
console.error('Error creando el post:', error);
});
FieldValue.serverTimestamp() entrega fecha y hora del servidor.El controlador de post crea la instancia de la clase, valida si el usuario está autenticado y, solo entonces, llama a la función de creación. Se muestran mensajes según el éxito o el error, y se depuran fallos como variables mal nombradas.
firebase.auth().currentUser.null: informar que debe autenticarse y salir.const user = firebase.auth().currentUser;
if (user === null) {
// Mostrar alerta: para crear el post debe estar autenticado.
return;
}
uid del usuario, email, titulo, descripcion, linkImagen, linkVideo.emailUser en lugar de autor).¿Te gustaría que ampliemos con lectura en tiempo real y consultas filtradas en Firestore? Deja tus dudas o casos de uso en los comentarios.
las líneas
const settings = { timestampsInSnapshots : true}
this.db.settings(settings)
ya no son necesarias puesto que esta configuración ya está por defecto :D
Este es otro ejemplo de cómo se podría agregar datos
async function addUser(){
let userData = {
name: "Andres 2",
lastName: "Sanabria",
birthdate: firebase.firestore.FieldValue.serverTimestamp(),
email: "email@gmail.com",
profession: "UX/UI Designer"
}
let newDocID = await firebase.firestore().collection("users").add(userData).then(doc => doc.id);
console.log("Saved: ", newDocID);
}
Un cambio de pasta térmica a los profesores no estaría mal, a lo mejor sea muy quisquilloso o parece que la computadora esta a punto de despegar 😂
creo que seria bueno actualizar este curso
Ya no es necesario hacer la configuración explicita de timestampsInSnapshots.
```const settings = { timestampsInSnapshots: true };
this.db.settings(settings);
Platzinautas, para evitar un error en post, necesitamos quitar los settings, quiten todo este codigo que les muestro 👇
La nueva actualizacion de firestore, esto lo tiene ahora como default true
timestampsInSnapshots: true // Ya es por default en firestore
Si tienen problemas de permisos para guardar en la DB, vayan a la tab de Reglas de Database y poner en true los permisos de lectura/escritura:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
esto esta actualizado??
Buenas, como se manejan los tipos de datos REFERENCE, que haga referencia a un documento de otra coleccion.
acabo de notar que la sesion se queda iniciada incluso despues de cerrar el navegador, como se puede evitar esto?. Si necesito que la sesión se cierre cuando se cierre el navegador
Carolina Londoño
ABEL IGNACIO ALARCON
Andrés Enrique Sanabria Flores
Esteban Guzmán Ramírez
Walter Salas
DANIEL SUAREZ
Manuel Aguilera Magaña
OSCAR ALFREDO CHAFLOQUE TAMPECK
Hector Romero
Kengya Moncada
Carolina Londoño
Sebastian Garcia Nallar
Omar Daniel Centeno
Michael Garcia
Karol Leal Rojas
Daniel Esteves
Jose Rueda
Juan Guillermo Gómez Torres
ProfesorAlbert Jiménez
Alejandro Novillo
Juan Guillermo Gómez Torres
ProfesorMayra Montalván
Joalin Pineda
Boris Vargas Paucara
JOSE ADRIAN TEZOYOTL MORALES
Daniel Esteves
Alejandro González Reyes
Daniel Esteves
Alejandro González Reyes
Alejandro González Reyes
Yerlinson Maturana Serna
Mariangelica Useche
Team PlatziNelson Aranda
Jonattan Infante
Juan Franco Segnana
Jose Monterrey
Jose Luis Campos Bautista
Didier Emmanuel Matos Torres
las líneas
const settings = { timestampsInSnapshots : true} this.db.settings(settings)
ya no son necesarias puesto que esta configuración ya está por defecto :D
ohh
Este es otro ejemplo de cómo se podría agregar datos
async function addUser(){ let userData = { name: "Andres 2", lastName: "Sanabria", birthdate: firebase.firestore.FieldValue.serverTimestamp(), email: "email@gmail.com", profession: "UX/UI Designer" } let newDocID = await firebase.firestore().collection("users").add(userData).then(doc => doc.id); console.log("Saved: ", newDocID); }
Un cambio de pasta térmica a los profesores no estaría mal, a lo mejor sea muy quisquilloso o parece que la computadora esta a punto de despegar 😂
Genial... ahora no puedo dejar de escuchar el abanico! jajaja
creo que seria bueno actualizar este curso
Ya no es necesario hacer la configuración explicita de timestampsInSnapshots.
```const settings = { timestampsInSnapshots: true }; this.db.settings(settings);
Cierto, Gracias, pero si tipamos en la clase. fecha?: firebase.firestore.FieldValue;
Platzinautas, para evitar un error en post, necesitamos quitar los settings, quiten todo este codigo que les muestro 👇
timestampsInSnapshots: true // Ya es por default en firestore
super! efectivamente hay cosas que han cambiado o sea, actualizado
Si tienen problemas de permisos para guardar en la DB, vayan a la tab de Reglas de Database y poner en true los permisos de lectura/escritura:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
esto esta actualizado??
Hola
Si bien la teoría y la práctica son un gran ejemplo de lo que puedes lograr con Firebase, la plataforma ha recibido diferentes actualizaciones y la información en muchas ocasiones se encuentra distribuida de forma distinta.
La tecnología avanza a pasos agigantados y por eso nunca paramos de aprender.
Saludos
Hola! si bien el curso no esta "actualizado", acabo de terminarlo y no tuve mayores complicaciones, alguna que otra cosita cambia, pero en los mismos comentario los compañeros suelen poner que ha cambiado, en conclusion, diria que puedes seguir el curso sin problemas.
Buenas, como se manejan los tipos de datos REFERENCE, que haga referencia a un documento de otra coleccion.
¡Hola Karol! Por acá te dejo este enlace de la documentación donde hablar de cómo hacer las referencias
acabo de notar que la sesion se queda iniciada incluso despues de cerrar el navegador, como se puede evitar esto?. Si necesito que la sesión se cierre cuando se cierre el navegador
Hola, pienso que como esta es la practica adecuada, gmail te guarda la sesión así cierres todo. Ahora, lo que requieres lo puedes hacer cambiando el tipo de persistencia a SESSION por default es LOCAL. firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION). Puedes ver mas de esto en:
También se puede generar una subrutina que se ejecute al salir de la pagina.
hola consulta.. todo se ejecuta del lado del cliente? no es algo inseguro?
El SDK de firebase usa RPC osea parece que hace local pero en verdad envia muchas cosas al servidor. Y con respecto a la seguridad hay que implementar reglas a nivel de Firestore o Storage o algo nuevo Firebase App Check
El curso está desactualizado, pero bueno quería tener una idea de lo que es la BD de FireStore (coleciones, documentos). Al menos para eso me sirvió este curso.
Saludos
Hola! Gracias por tu comentario, estamos trabajando en actualizar y mejorar los cursos para ofrecerte una gran experiencia de aprendizaje, de momento puedes darte una vuelta por el Curso de MongoDB donde puedes aprender más sobre bases de datos No relacionales así como más sobre las colecciones y documentos. Te recomiendo estar al pendiente de los nuevos lanzamientos en platzi/agenda, lanzamos cursos nuevos cada semana. Cuéntanos ¿qué te gustaría aprender?.
Si tienen algun error, posiblemente sea por los permisos.
La estructura json para el post fue creado desde el codigo o desde la consola?
La estructura de JSON ya la trae por defecto Firebase es lo que va a retornar :muscle:
La siguiente linea de código que es lo que retorna?
return this.db.collection('posts').add({ .... }) .then(...) .catch(...)
Lo que hace este return es conseguir la colección de posts y añadir los datos que le estamos pasando y si todo está bien retorna el resultado y si no retorna el error
Hola, tengo el siguiente problema. Cuando registro el Post, Firestore lo almacena 2 veces.
crearPost (uid, emailUser, titulo, descripcion, imagenLink, videoLink) { // Indicamos a firestore que coleccion se va a emplear para añadir el documento // El método add, genera automáticamene el id del documento // En este caso add devuelve promesa, por tanto la retornamos para que en la sección donde se invoca // este metodo, se hagan tareas una vez registrados los datos return this.db.collection('posts').add({ uid: uid, autor: emailUser, titulo: titulo, descripcion: descripcion, imagenLink: imagenLink, videoLink: videoLink, // En este caso le indicamos a firestore que genere la fecha actual en el servidor fecha: firebase.firestore.FieldValue.serverTimestamp() }) .then(refDoc => { console.log(`Id del Post: ${refDoc.id}`) }) .catch(error => { console.log(`Error al crear el post: ${error}`) }) }
$('#btnRegistroPost').click(() => { // Creamos una instancia de la clase Post para registrar el documento const post = new Post() // TODO: Validar que el usuario esta autenticado const user = firebase.auth().currentUser if(user == null) { Materialize.toast(`Para crear el Post debes estar autenticado`, 4000) // Hacemos esto para que no se ejecute lo demas return } // Materialize.toast(`Para crear el post debes estar autenticado`, 4000) // Recuperar la data del formulario para crear el POST const titulo = $('#tituloNewPost').val() const descripcion = $('#descripcionNewPost').val() const videoLink = $('#linkVideoNewPost').val() const imagenLink = sessionStorage.getItem('imgNewPost') == 'null' ? null : sessionStorage.getItem('imgNewPost') // Invocar el método crearPost para proceder a guardarlo post.crearPost(user.uid, user.email, titulo, descripcion, imagenLink, videoLink) .then(resp => { // En el cuerpo del método retornamos una promise // Por tanto la usamos aqui para realizar tareas posteriores al registro Materialize.toast(`Post creado correctamente`, 4000) // Cerrar el modal con el form de registro de post $('.modal').modal('close') }) .catch(err => { Materialize.toast(`Error => ${err}`, 4000) }) })
Yo solo me respondo, jajjja. Al parecer el problema viene en esta línea. 'null' por null
const imagenLink = sessionStorage.getItem('imgNewPost') == null ? null : sessionStorage.getItem('imgNewPost')
¿Cómo se puede personalizar el modelo de autenticación? Es decir, agregarle atributos adicionales como dirección, edad, fechaDeNacimiento, etc?
Para esto debes crear una colección en la base de datos con todos los campos custom que quieras (como la fecha de nacimiento, dirección, etc.).
Espero haberme explicado. Saludos.
En el contructor de la clase no hace falta el siguiente codigo:
const settings = {timestampsInSnapshots : true} this.db.settings(settings)
La configuracion ya se encuentra configurado por default en la version de firebase 5.8.x
Solo como un dato, Actualmente la propiedad **timestampsInSnapshots **esta deprecada. Les dejo el link a la documentación por si deseas checarlo
Gracias, pero que habría que poner en su reemplazo?
actualmente con la nueva version se tienen que quitar las lineas de const settings = { timestampsInSnapshots: true } this.db.settings(settings) pero ahora tengo un proble que dice onSnapshot: FirebaseError: "Missing or insufficient permissions." alguien mas?
En la sección de reglas puedes configurar los permisos de escritura en tu base de datos.
hola tengo un problema similar, de igual manera removí las lineas de : const settings = { timestampsInSnapshots : true} this.db.settings(settings)
sin embargo me sale un error lo cual indica: Uncaught TypeError: firebase.firestore is not a function