web-dev-qa-db-fra.com

Comment utiliser les émulateurs Firebase pubsub pour tester les fonctions chronométrées localement?

J'utilise Firebase pour un projet et je travaille sur la création d'une fonction de planification à l'aide du code suivant. Je veux enregistrer un message chaque minute que cela fonctionne.

export const timedQuery = functions.pubsub.schedule('1 * * * *').onRun((context) => {
console.log("I am running")
return null;
})

J'ai la logique principale du code fonctionnant sous une fonction http et j'aimerais voir si cela fonctionne localement avant de le déployer en production. En parcourant la documentation Firebase, j'ai téléchargé tous les émulateurs Firebase et j'utilise "émulateurs firebase: start" pour les faire fonctionner. D'après les journaux, il semble que mon émulateur pubsub démarre avec succès à localhost: 8085 et la fonction pubsub est initialisée, mais même après avoir attendu 2 à 3 minutes, rien ne s'imprime. Est-il possible de tester les fonctions planifiées localement?

J'ai également créé cela sans utiliser le planificateur de cloud Google puisque je ne suis que sur Firebase.

3
zeke13210

En fait, il existe un émulateur Firebase PubSub. Pour l'activer, vous devez avoir la récente CLI installée (c'est dans 8.2.0 à coup sûr)

  • Réexécuter Firebase Init
  • Sélectionnez les émulateurs (barre d'espace)
  • Sélectionnez PubSub (et les autres que vous souhaitez)
  • Configurez les ports de développement souhaités
  • Demandez à la CLI d'installer les émulateurs

Créez un script de test localement pour soumettre les messages PubSub dans la file d'attente:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const { PubSub } = require('@google-cloud/pubsub');
const pubsub = new PubSub();

exports.pubsubWriter = functions.https.onRequest(async (req, res) => {
    console.log("Pubsub Emulator:", process.env.PUBSUB_EMULATOR_Host);

    const msg = await pubsub.topic('test-topic').publishJSON({
        foo: 'bar',
        date: new Date()
    }, { attr1: 'value' });

    res.json({
        published: msg
    })
});
2
Arno Zwaag