Per iniziare a utilizzare Cloud Functions, prova a seguire questo tutorial, che inizia con le attività di configurazione richieste e procede attraverso la creazione, il test e la distribuzione di due funzioni correlate:
- Una funzione "aggiungi messaggio" che espone un URL che accetta un valore di testo e lo scrive su Cloud Firestore.
- Una funzione "rendi maiuscolo" che si attiva su una scrittura Cloud Firestore e trasforma il testo in maiuscolo.
Abbiamo scelto Cloud Firestore e le funzioni JavaScript attivate da HTTP per questo esempio in parte perché questi attivatori in background possono essere testati approfonditamente tramite Firebase Local Emulator Suite . Questo set di strumenti supporta anche i trigger richiamabili Realtime Database, PubSub, Auth e HTTP. Altri tipi di trigger in background come i trigger Remote Config, TestLab e Analytics possono essere tutti testati in modo interattivo utilizzando set di strumenti non descritti in questa pagina.
Le sezioni seguenti di questa esercitazione descrivono in dettaglio i passaggi necessari per compilare, testare e distribuire l'esempio. Se preferisci semplicemente eseguire il codice ed esaminarlo, passa a Revisione del codice di esempio completo .
Crea un progetto Firebase
Nella console Firebase , fai clic su Aggiungi progetto .
Per aggiungere risorse Firebase a un progetto Google Cloud esistente , inserisci il nome del progetto o selezionalo dal menu a discesa.
Per creare un nuovo progetto, inserisci il nome del progetto desiderato. Facoltativamente, puoi anche modificare l'ID progetto visualizzato sotto il nome del progetto.
Se richiesto, esamina e accetta i termini di Firebase .
Fare clic su Continua .
(Facoltativo) Configura Google Analytics per il tuo progetto, che ti consente di avere un'esperienza ottimale utilizzando uno dei seguenti prodotti Firebase:
Seleziona un account Google Analytics esistente o crea un nuovo account.
Se crei un nuovo account, seleziona la posizione dei report di Analytics , quindi accetta le impostazioni di condivisione dei dati e i termini di Google Analytics per il tuo progetto.
Fai clic su Crea progetto (o Aggiungi Firebase , se stai utilizzando un progetto Google Cloud esistente).
Firebase effettua automaticamente il provisioning delle risorse per il tuo progetto Firebase. Una volta completato il processo, verrai indirizzato alla pagina di panoramica del tuo progetto Firebase nella console Firebase.
Configura Node.js e la CLI Firebase
Avrai bisogno di un ambiente Node.js per scrivere funzioni e della CLI Firebase per distribuire funzioni nel runtime Cloud Functions. Per installare Node.js e npm , si consiglia Node Version Manager .
Dopo aver installato Node.js e npm, installa la CLI Firebase tramite il tuo metodo preferito. Per installare la CLI tramite npm, utilizzare:
npm install -g firebase-tools
Questo installa il comando firebase disponibile a livello globale. Se il comando fallisce, potrebbe essere necessario modificare le autorizzazioni npm . Per aggiornare all'ultima versione di firebase-tools
, esegui nuovamente lo stesso comando.
Inizializza il tuo progetto
Quando inizializzi Firebase SDK for Cloud Functions, crei un progetto vuoto contenente le dipendenze e un codice di esempio minimo e scegli TypeScript o JavaScript per comporre le funzioni. Ai fini di questo tutorial, dovrai anche inizializzare Cloud Firestore.
Per inizializzare il tuo progetto:
- Esegui
firebase login
per accedere tramite il browser e autenticare la CLI di Firebase. - Vai alla directory del tuo progetto Firebase.
- Esegui
firebase init firestore
. Per questo tutorial, puoi accettare i valori predefiniti quando ti vengono richieste le regole Firestore e i file di indice. Se non hai ancora utilizzato Cloud Firestore in questo progetto, dovrai anche selezionare una modalità e una posizione di avvio per Firestore come descritto in Iniziare con Cloud Firestore . - Esegui
firebase init functions
. La CLI richiede di scegliere una codebase esistente o di inizializzarne e denominarne una nuova. Quando hai appena iniziato, è adeguata una singola base di codice nella posizione predefinita; in seguito, man mano che la tua implementazione si espande, potresti voler organizzare le funzioni in codebase . La CLI offre due opzioni per il supporto linguistico:
- JavaScript
- TypeScript Per ulteriori informazioni, vedere Funzioni di scrittura con TypeScript .
Per questo tutorial, seleziona JavaScript .
La CLI ti offre la possibilità di installare le dipendenze con npm. È sicuro rifiutare se desideri gestire le dipendenze in un altro modo, tuttavia se rifiuti dovrai eseguire
npm install
prima di emulare o distribuire le tue funzioni.
Una volta completati correttamente questi comandi, la struttura del progetto avrà il seguente aspetto:
myproject
+- .firebaserc # Hidden file that helps you quickly switch between
| # projects with `firebase use`
|
+- firebase.json # Describes properties for your project
|
+- functions/ # Directory containing all your functions code
|
+- .eslintrc.json # Optional file containing rules for JavaScript linting.
|
+- package.json # npm package file describing your Cloud Functions code
|
+- index.js # main source file for your Cloud Functions code
|
+- node_modules/ # directory where your dependencies (declared in
# package.json) are installed
Il file package.json
creato durante l'inizializzazione contiene una chiave importante: "engines": {"node": "16"}
. Questo specifica la versione di Node.js per la scrittura e la distribuzione delle funzioni. È possibile selezionare altre versioni supportate .
Importa i moduli richiesti e inizializza un'app
Dopo aver completato le attività di configurazione, puoi aprire la directory di origine e iniziare ad aggiungere il codice come descritto nelle sezioni seguenti. Per questo esempio, il tuo progetto deve importare i moduli Cloud Functions e Admin SDK utilizzando le istruzioni Node require
. Aggiungi righe come le seguenti al tuo file index.js
:
// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers. const functions = require('firebase-functions/v1'); // The Firebase Admin SDK to access Firestore. const admin = require("firebase-admin"); admin.initializeApp();
Queste righe caricano i moduli firebase-functions
e firebase-admin
e inizializzano un'istanza dell'app admin
da cui è possibile apportare modifiche a Cloud Firestore. Ovunque sia disponibile il supporto Admin SDK , come per FCM, Authentication e Firebase Realtime Database, fornisce un modo potente per integrare Firebase utilizzando Cloud Functions.
La CLI Firebase installa automaticamente i moduli Firebase e Firebase SDK for Cloud Functions Node quando inizializzi il progetto. Per aggiungere librerie di terze parti al tuo progetto, puoi modificare package.json
ed eseguire npm install
. Per ulteriori informazioni, consulta Gestire le dipendenze .
Aggiungi la funzione addMessage()
Per la funzione addMessage()
, aggiungi queste righe a index.js
:
// Take the text parameter passed to this HTTP endpoint and insert it into // Firestore under the path /messages/:documentId/original exports.addMessage = functions.https.onRequest(async (req, res) => { // Grab the text parameter. const original = req.query.text; // Push the new message into Firestore using the Firebase Admin SDK. const writeResult = await admin .firestore() .collection("messages") .add({ original: original }); // Send back a message that we've successfully written the message res.json({ result: `Message with ID: ${writeResult.id} added.` }); });
La funzione addMessage()
è un endpoint HTTP. Qualsiasi richiesta all'endpoint risulta in oggetti Request e Response in stile ExpressJS passati al callback onRequest()
.
Le funzioni HTTP sono sincrone (simili alle funzioni richiamabili ), quindi dovresti inviare una risposta il più rapidamente possibile e rinviare il lavoro utilizzando Cloud Firestore. La funzione HTTP addMessage()
passa un valore di testo all'endpoint HTTP e lo inserisce nel database nel percorso /messages/:documentId/original
.
Aggiungi la funzione makeUppercase()
Per la funzione makeUppercase()
, aggiungi queste righe a index.js
:
// Listens for new messages added to /messages/:documentId/original and creates an // uppercase version of the message to /messages/:documentId/uppercase exports.makeUppercase = functions.firestore .document("/messages/{documentId}") .onCreate((snap, context) => { // Grab the current value of what was written to Firestore. const original = snap.data().original; // Access the parameter `{documentId}` with `context.params` functions.logger.log("Uppercasing", context.params.documentId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing asynchronous tasks inside a Functions such as // writing to Firestore. // Setting an 'uppercase' field in Firestore document returns a Promise. return snap.ref.set({ uppercase }, { merge: true }); });
La funzione makeUppercase()
viene eseguita quando viene scritto Cloud Firestore. La funzione ref.set
definisce il documento su cui ascoltare. Per motivi di prestazioni, dovresti essere il più specifico possibile.
Le parentesi graffe, ad esempio {documentId}
racchiudono "parametri", caratteri jolly che espongono i dati corrispondenti nel callback.
Cloud Firestore attiva il callback onCreate()
ogni volta che vengono aggiunti nuovi messaggi.
Le funzioni guidate dagli eventi come gli eventi Cloud Firestore sono asincrone. La funzione di callback dovrebbe restituire un null
, un Object o una Promise . Se non si restituisce nulla, la funzione va in timeout, segnalando un errore, e viene ritentata. Consulta Sincronizzazione, asincrono e promesse .
Emula l'esecuzione delle tue funzioni
Firebase Local Emulator Suite ti consente di creare e testare app sul tuo computer locale invece di distribuirle su un progetto Firebase. Si consiglia vivamente di eseguire test locali durante lo sviluppo, in parte perché riduce il rischio di errori di codifica che potrebbero comportare costi in un ambiente di produzione (ad esempio, un ciclo infinito).
Per emulare le tue funzioni:
Esegui
firebase emulators:start
e controlla nell'output l'URL dell'interfaccia utente di Emulator Suite. Il valore predefinito è localhost:4000 , ma potrebbe essere ospitato su una porta diversa sul tuo computer. Inserisci l'URL nel tuo browser per aprire l'interfaccia utente di Emulator Suite.Controlla l'output del comando
firebase emulators:start
per l'URL della funzione HTTPaddMessage()
. Sarà simile ahttp://localhost:5001/MY_PROJECT/us-central1/addMessage
, tranne che:-
MY_PROJECT
verrà sostituito con il tuo ID progetto. - La porta potrebbe essere diversa sul tuo computer locale.
-
Aggiungi la stringa di query
?text=uppercaseme
alla fine dell'URL della funzione. Dovrebbe essere simile a:http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme
. Facoltativamente, è possibile modificare il messaggio "maiuscolo" in un messaggio personalizzato.Crea un nuovo messaggio aprendo l'URL in una nuova scheda nel tuo browser.
Visualizza gli effetti delle funzioni nell'interfaccia utente di Emulator Suite:
Nella scheda Log , dovresti vedere nuovi log che indicano l'esecuzione delle funzioni
addMessage()
emakeUppercase()
:i functions: Beginning execution of "addMessage"
i functions: Beginning execution of "makeUppercase"
Nella scheda Firestore , dovresti vedere un documento contenente il tuo messaggio originale e la versione in maiuscolo del tuo messaggio (se originariamente era "uppercaseme", vedrai "UPPERCASEME").
Distribuire le funzioni in un ambiente di produzione
Una volta che le funzioni funzionano come desiderato nell'emulatore, puoi procedere alla loro distribuzione, test ed esecuzione nell'ambiente di produzione. Tieni presente che per eseguire la distribuzione nell'ambiente runtime Node.js 14 consigliato, il tuo progetto deve rientrare nel piano tariffario Blaze . Consulta i prezzi di Cloud Functions .
Per completare il tutorial, distribuisci le tue funzioni e quindi esegui addMessage()
per attivare makeUppercase()
.
Esegui questo comando per distribuire le tue funzioni:
firebase deploy --only functions
Dopo aver eseguito questo comando, la CLI di Firebase restituisce l'URL per qualsiasi endpoint della funzione HTTP. Nel tuo terminale dovresti vedere una riga come la seguente:
Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
L'URL contiene l'ID del progetto e una regione per la funzione HTTP. Sebbene non sia necessario preoccuparsene ora, alcune funzioni HTTP di produzione dovrebbero specificare una posizione per ridurre al minimo la latenza di rete.
Se riscontri errori di accesso come "Impossibile autorizzare l'accesso al progetto", prova a controllare l'aliasing del progetto .
Utilizzando l'output dell'URL
addMessage()
dalla CLI, aggiungi un parametro di query di testo e aprilo in un browser:https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
La funzione esegue e reindirizza il browser alla console Firebase nella posizione del database in cui è archiviata la stringa di testo. Questo evento di scrittura attiva
makeUppercase()
, che scrive una versione in maiuscolo della stringa.
Dopo aver distribuito ed eseguito le funzioni, puoi visualizzare i log nella console Google Cloud . Se devi eliminare funzioni in fase di sviluppo o produzione, utilizza la CLI Firebase.
In produzione, potresti voler ottimizzare le prestazioni delle funzioni e controllare i costi impostando il numero minimo e massimo di istanze da eseguire. Vedi Controllare il comportamento di ridimensionamento per ulteriori informazioni su queste opzioni di runtime.
Esaminare il codice di esempio completo
Ecco il file functions/index.js
completato contenente le funzioni addMessage()
e makeUppercase()
. Queste funzioni ti consentono di passare un parametro a un endpoint HTTP che scrive un valore su Cloud Firestore e quindi lo trasforma mettendo in maiuscolo tutti i caratteri nella stringa.
// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers. const functions = require('firebase-functions/v1'); // The Firebase Admin SDK to access Firestore. const admin = require("firebase-admin"); admin.initializeApp(); // Take the text parameter passed to this HTTP endpoint and insert it into // Firestore under the path /messages/:documentId/original exports.addMessage = functions.https.onRequest(async (req, res) => { // Grab the text parameter. const original = req.query.text; // Push the new message into Firestore using the Firebase Admin SDK. const writeResult = await admin .firestore() .collection("messages") .add({ original: original }); // Send back a message that we've successfully written the message res.json({ result: `Message with ID: ${writeResult.id} added.` }); }); // Listens for new messages added to /messages/:documentId/original and creates an // uppercase version of the message to /messages/:documentId/uppercase exports.makeUppercase = functions.firestore .document("/messages/{documentId}") .onCreate((snap, context) => { // Grab the current value of what was written to Firestore. const original = snap.data().original; // Access the parameter `{documentId}` with `context.params` functions.logger.log("Uppercasing", context.params.documentId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing asynchronous tasks inside a Functions such as // writing to Firestore. // Setting an 'uppercase' field in Firestore document returns a Promise. return snap.ref.set({ uppercase }, { merge: true }); });
Prossimi passi
In questa documentazione puoi scoprire di più su come gestire le funzioni per Cloud Functions e su come gestire tutti i tipi di eventi supportati da Cloud Functions.
Per ulteriori informazioni su Cloud Functions, puoi anche procedere come segue:
- Leggi informazioni sui casi d'uso per Cloud Functions .
- Prova il codelab Cloud Functions .
- Esamina ed esegui esempi di codice su GitHub