Gestione delle sessioni con Firestore


Molte app hanno bisogno di gestione della sessione per autenticazione e preferenze utente. Il framework Node.js Express viene fornito con un'implementazione basata sulla memoria per eseguire questa funzione. Tuttavia, questa implementazione non è adatta per un'app che può essere pubblicata da più istanze, perché la sessione registrata in un'istanza potrebbe essere diversa da altre. Questo tutorial mostra come gestire le sessioni su App Engine.

Obiettivi

  • Scrivi l'app.
  • Esegui l'app localmente.
  • Eseguire il deployment dell'app su App Engine.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Attiva l'API Firestore.

    Abilita l'API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  9. Attiva l'API Firestore.

    Abilita l'API

  10. Installa Google Cloud CLI.
  11. Per initialize gcloud CLI, esegui questo comando:

    gcloud init

Configurazione del progetto

  1. Nella finestra del terminale, inizia in una directory a tua scelta e crea una nuova directory denominata sessions. Tutto il codice per questo tutorial è all'interno della directory sessions.

  2. Passa alla directory sessions:

    cd sessions
    
  3. Inizializza il file package.json:

    npm init .
    
  4. Installa le dipendenze:

    npm install \
     --save @google-cloud/connect-firestore @google-cloud/firestore express express-session
    

Alla fine di questo tutorial, la struttura dei file finali è simile alla seguente:

sessions
├── app.yaml
├── index.js
└── package.json

Scrittura dell'app web

Questa app visualizza i saluti in diverse lingue per ogni utente. Gli utenti di ritorno vengono sempre accolti nella stessa lingua.

Diverse finestre delle app che mostrano un annuncio in lingue diverse.

Prima che la tua app possa memorizzare le preferenze per un utente, devi conoscere un modo per memorizzare le informazioni sull'utente corrente in una sessione. Questa app di esempio utilizza Firestore per archiviare i dati della sessione.

Puoi utilizzare connect-firestore, uno store compatibile con express-session.

  • Nella finestra del terminale, crea un file denominato index.js con il seguente contenuto:

    // Copyright 2019, Google LLC.
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //    http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    const {Firestore} = require('@google-cloud/firestore');
    const express = require('express');
    const session = require('express-session');
    
    const app = express();
    const {FirestoreStore} = require('@google-cloud/connect-firestore');
    
    app.use(
      session({
        store: new FirestoreStore({
          dataset: new Firestore(),
          kind: 'express-sessions',
        }),
        secret: 'my-secret',
        resave: false,
        saveUninitialized: true,
      })
    );
    
    const greetings = [
      'Hello World',
      'Hallo Welt',
      'Ciao Mondo',
      'Salut le Monde',
      'Hola Mundo',
    ];
    
    app.get('/', (req, res) => {
      if (!req.session.views) {
        req.session.views = 0;
        req.session.greeting =
          greetings[Math.floor(Math.random() * greetings.length)];
      }
      const views = req.session.views++;
      res.send(`${views} views for ${req.session.greeting}`);
    });
    
    const port = process.env.PORT || 8080;
    app.listen(port, () => {
      console.log(`Example app listening on port ${port}!`);
    });
    
    module.exports = app;
    

Il seguente diagramma illustra in che modo Firestore gestisce le sessioni per l'app App Engine.

Diagramma dell'architettura: utente, App Engine, Firestore.

Dopo aver impostato app.use(session), ogni richiesta ha una proprietà req.session che puoi utilizzare per identificare gli utenti ricorrenti. I dati della sessione vengono archiviati in Firestore.

Eliminazione di sessioni

Connect-firestore non elimina le sessioni vecchie o scadute. Puoi eliminare i dati della sessione nella console Google Cloud o implementare una strategia di eliminazione automatica. Se utilizzi soluzioni di archiviazione per sessioni come Memcache o Redis, le sessioni scadute vengono eliminate automaticamente.

Esecuzione locale

  1. Nella finestra del terminale, installa le dipendenze per il progetto Google Cloud:

    npm install
    
  2. Avvia il server HTTP:

    npm start
    
  3. Visualizza l'app nel tuo browser web:

    Cloud Shell

    Nella barra degli strumenti di Cloud Shell, fai clic su Anteprima web Anteprima web e seleziona Anteprima sulla porta 8080.

    Macchina locale

    Nel browser, vai a http://localhost:8080

    Vedrai uno dei cinque saluti: "Ciao mondo", "Hallo Welt", "Hola mundo", "Salut le Monde" o "Ciao mondo". La lingua cambia se apri la pagina in un altro browser o in modalità di navigazione in incognito. Puoi visualizzare e modificare i dati della sessione nella console Google Cloud.

    Sessioni Firestore nella console Google Cloud.

  4. Per interrompere il server HTTP, premi Control+C nella finestra del terminale.

Deployment ed esecuzione su App Engine

Puoi utilizzare l'ambiente standard di App Engine per creare ed eseguire il deployment di un'app che può essere eseguita in modo affidabile con un carico elevato e con grandi quantità di dati.

Questo tutorial utilizza l'ambiente standard di App Engine per eseguire il deployment del server.

  1. Nella finestra del terminale, crea un file app.yaml e copia quanto segue:

    runtime: nodejs10
  2. Esegui il deployment dell'app su App Engine:

    gcloud app deploy
    
  3. Visualizza l'app pubblicata inserendo il seguente URL:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Sostituisci quanto segue:

Il saluto ora viene consegnato da un server web in esecuzione su un'istanza di App Engine.

Eseguire il debug dell'app

Se non riesci a connetterti all'app App Engine, controlla quanto segue:

  1. Verifica che i comandi di deployment di gcloud siano stati completati correttamente e che non abbiano restituito errori. Se si sono verificati errori (ad esempio message=Build failed), correggili e prova a eseguire nuovamente il deployment dell'app App Engine.
  2. Nella console Google Cloud, vai alla pagina Esplora log.

    Vai alla pagina Esplora log

    1. Nell'elenco a discesa Risorse selezionate di recente, fai clic su Applicazione App Engine, quindi fai clic su Tutti i moduli_id. Viene visualizzato un elenco di richieste da quando hai visitato la tua app. Se non visualizzi un elenco di richieste, verifica di aver selezionato All module_id dall'elenco a discesa. Se vengono visualizzati messaggi di errore nella console Google Cloud, verifica che il codice dell'app corrisponda a il codice nella sezione relativa alla scrittura dell'app web.

    2. Assicurati che l'API Firestore sia abilitata.

Esegui la pulizia

Elimina il progetto

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina l'istanza di App Engine

  1. Nella console Google Cloud, vai alla pagina Versioni di App Engine.

    Vai a Versioni

  2. Seleziona la casella di controllo relativa alla versione non predefinita dell'app che vuoi eliminare.
  3. Per eliminare la versione dell'app, fai clic su Elimina.

Passaggi successivi