← blog
Firebase Realtime Database JavaScript SDK v9

Firebase RTDB: lettura una tantum vs ascolto real-time

In Firebase Realtime Database hai due modi per leggere i dati: una volta sola (get() / once()) o in ascolto continuo (onValue() / on()). Scegliere quello sbagliato costa letture inutili e mantiene connessioni WebSocket aperte senza motivo.

SDK v9 (modulare) β€” il modo moderno

rtdb-v9.js β€” lettura una tantum
import { getDatabase, ref, get } from 'firebase/database';

const db = getDatabase();

// βœ… Legge una volta sola β€” ideale per dati storici o config
async function readOnce(path) {
  const snap = await get(ref(db, path));
  if (snap.exists()) {
    return snap.val(); // oggetto JS con i dati
  }
  return null;
}

// Uso
const utente = await readOnce(`users/${uid}`);
console.log(utente.nome);
rtdb-v9.js β€” ascolto real-time
import { getDatabase, ref, onValue, off } from 'firebase/database';

const db = getDatabase();

// βœ… Ascolta le modifiche in real-time
function listenMessages(chatId, callback) {
  const chatRef = ref(db, `chats/${chatId}/messages`);

  const unsub = onValue(chatRef, snap => {
    const msgs = snap.exists() ? Object.values(snap.val()) : [];
    callback(msgs);
  });

  // Restituisce la funzione di unsubscribe β€” chiamala quando esci dalla pagina
  return unsub;
}

// Avvia ascolto
const stopListening = listenMessages('room-42', msgs => {
  console.log('Nuovi messaggi:', msgs);
});

// Ferma l'ascolto (es. quando l'utente lascia la pagina)
// stopListening();

SDK v8 (compat) β€” se usi ancora il vecchio SDK

rtdb-v8.js
const db = firebase.database();

// Lettura una tantum (v8)
db.ref(`users/${uid}`).once('value').then(snap => {
  if (snap.exists()) console.log(snap.val());
});

// Ascolto real-time (v8)
const chatRef = db.ref(`chats/room-42/messages`);
chatRef.on('value', snap => {
  console.log(snap.val());
});

// Rimuovi listener
chatRef.off('value');

Quando usare quale

Caso d'usoMetodoPerchΓ©
Profilo utente all'aperturaget()Dati statici, non cambiano mentre l'utente Γ¨ loggato
Configurazione appget()Leggi una volta, metti in cache locale
Chat in tempo realeonValue()I messaggi arrivano mentre l'utente Γ¨ nella pagina
Stato presenze onlineonValue()Cambia frequentemente e in modo imprevedibile
Storico ordini / logget()Dati passati immutabili β€” nessun motivo di stare in ascolto
Notifiche in arrivoonValue()Devono apparire istantaneamente senza refresh

Regola pratica: se il dato puΓ² cambiare mentre l'utente Γ¨ nella pagina e lui deve vederlo subito, usa onValue(). In tutti gli altri casi usa get() e risparmia connessioni e costi.

Memory leak comune: ogni onValue() apre una connessione WebSocket che rimane attiva finchΓ© non chiami unsubscribe(). In una SPA, pulisci sempre i listener quando il componente viene smontato.

Articolo correlato
Calendario condiviso su PWA: Firebase Realtime Database e notifiche push FCM
β†’
Articolo correlato
Catalogo file dinamico con Firebase RTDB e Storage: modal admin e race condition asincrona
β†’