web-dev-qa-db-fra.com

comment tester les fonctions de cloud pour Firebase localement sur PC

Aujourd'hui, Firebase a publié son tout nouveau produit Cloud Functions for Firebase et je viens de créer une fonction hello world et de la déployer sur mon projet firebase existant.

Il semble que cela regroupe toutes les dépendances et le télécharge sur firebase, comme le fait la fonction aws lambda. Mais cela prend trop de temps, même pour des modifications mineures du code, et nécessite également une bonne connectivité Internet. Si vous êtes hors ligne pour une raison quelconque, vous ne connaissez pas le code que vous écrivez jusqu'à ce que vous disposiez d'un moyen d'exécution et de test des fonctions hors connexion sur votre ordinateur local.

Existe-t-il un moyen de tester les fonctions de cloud pour Firebase localement?

25
Inzamam Malik

firebaser ici

Le déploiement de vos fonctions prend en effet plus de temps que ce que je suis normalement disposé à attendre. Nous travaillons dur pour améliorer cela et (comme l'a dit Brendan), nous travaillons sur un émulateur local.

Mais pour le moment, j'écris principalement ma logique métier dans un script de noeud distinct. De cette façon, je peux le tester à partir d’une invite locale avec la commande node speech.js. Une fois convaincu que la fonction fonctionne, je la copie/la colle dans mon fichier de fonctions réel ou (mieux) importe le module speech dans mon fichier de fonctions et je l'invoque à partir de là.

Un exemple abrégé que j'ai rapidement découvert est celui du câblage de l'extraction de texte à l'aide de l'API Cloud Vision. J'ai un fichier appelé ocr.js qui contient:

var fetch = require('node-fetch');

function extract_text(url, gcloud_authorization) {
  console.log('extract_text from image '+url+' with authorization '+gcloud_authorization);

  return fetch(url).then(function(res) {
    return res.buffer();
  }).then(function(buffer) {
    return fetch('https://vision.googleapis.com/v1/images:annotate?key='+gcloud_authorization, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        "requests":[
          {
            "image":{
              "content": buffer.toString('base64')
            },
            "features":[
              {
                "type":"TEXT_DETECTION",
                "maxResults":1
              }
            ]
          }
        ]
      })
    });
  }).then(function(res) {
    var json = res.json();
    if (res.status >= 200 && res.status < 300) {
      return json;
    } else {
      return json.then(Promise.reject.bind(Promise));
    }
  }).then(function(json) {
    if (json.responses && json.responses.length && json.responses[0].error) {
      return Promise.reject(json.responses[0].error);
    }
    return json.responses[0].textAnnotations[0].description;
  });
}

if (process.argv.length > 2) {
  // by passing the image URL and gcloud access token, you can test this module
  process.argv.forEach(a => console.log(a));
  extract_text(
    process.argv[2], // image URL
    process.argv[3]  // gcloud access token or API key
  ).then(function(description) {
    console.log(description);
  }).catch(function(error) {
    console.error(error);
  });
}

exports.extract_text = extract_text;

Et puis dans mon Fonctions index.js, j'ai:

var functions = require('firebase-functions');
var fetch = require('node-fetch');
var ocr = require('./ocr.js');

exports.ocr = functions.database().path('/messages/{room}/{id}').onWrite(function(event) {
  console.log('OCR triggered for /messages/'+event.params.room+'/'+event.params.id);

  if (!event.data || !event.data.exists()) return;
  if (event.data.ocr) return;
  if (event.data.val().text.indexOf("https://firebasestorage.googleapis.com/") !== 0) return; // only OCR images

  console.log(JSON.stringify(functions.env));

  return ocr.extract_text(event.data.val().text, functions.env.googlecloud.apikey).then(function(text) {
    return event.data.adminRef.update({ ocr: text });
  });
});

Comme vous pouvez le constater, ce dernier fichier concerne en réalité simplement la "méthode de travail" ocr.extract_text à l'emplacement de la base de données.

Notez que ceci est un projet d'il y a quelque temps déjà, donc une partie de la syntaxe (principalement la partie functions.env) peut avoir légèrement changé.

22
Frank van Puffelen

firebaser ici

Pour déboguer vos fonctions Cloud pour Firebase localement, vous devez utiliser un émulateur. Voir le documentation pour plus d’informations .

16
Brendan G. Lim

Exécuter les fonctions localement

https://firebase.google.com/docs/functions/local-emulator

Pour utiliser cette fonctionnalité, firebase-tools doit disposer de la version minimale 3.8.0, et le SDK firebase-functions doit avoir au minimum la version 0.5.7. Mettre à jour Dans les deux cas, exécutez les commandes suivantes dans le répertoire functions/de votre projet:

npm install --save firebase-functions
npm install -g firebase-tools

Pour exécuter des fonctions localement, utilisez firebase serve:

firebase serve --only functions # to only emulate functions

Attention: Fonction expérimentale. Il s'agit d'une fonctionnalité expérimentale qui prend actuellement en charge uniquement l'émulation des fonctions HTTPS.

METTRE À JOUR:

Hey Fonctions Trusted Testers, 

Nous venons de publier firebase-tools v3.11.0, qui prend en charge une interface interactive Shell pour émuler tous les types de fonctions et les appeler avec données de test. Merci à beaucoup d’entre vous d’avoir participé aux commentaires sessions sur cette fonctionnalité. 

Consultez notre documentation pour savoir comment utiliser cette nouvelle fonctionnalité passionnante!

https://firebase.google.com/docs/functions/local-emulator#use_the_cloud_functions_Shell

9
Inzamam Malik

Répondu ici: https://github.com/firebase/firebase-functions/issues/4#issuecomment-286515989

Google Cloud Functions a également ouvert un émulateur local et nous en sommes le propriétaire travailler pour construire une intégration plus étroite avec les fonctions de nuage pour Base de feu. En attendant, vous pouvez le vérifier ici: https://github.com/GoogleCloudPlatform/cloud-functions-emulator/

L'émulateur vous permet d'exécuter des fonctions localement. Ici se trouve le documentation expliquant comment l'utiliser: https://cloud.google.com/functions/docs/emulator

1
Inzamam Malik

Pour les utilisateurs de vscode déboguant des fonctions HTTP (Webhooks, etc) ...

L'émulateur de cloud Google (firebase serve --only functions) lance un processus distinct pour exécuter vos fonctions. Vous pouvez attacher à ce processus avec vscode, mais comme l'émulateur ne crée que ce processus après la première fonction est appelée, ce n'est pas simple.

  • créez un noeud final HTTP factice dans vos fonctions qui renverra l'identificateur de processus:
app.get("/processid", function(request, response) {
  response.send(`${process.pid}`);
});
  • démarrez l'émulateur avec firebase serve --only functions
  • appelez le point final http://<localhost_url>/processid. Cela va créer le processus et renvoyer l'ID de processus
  • utilisez vscode pour vous connecter au processus spécifié. Vous pouvez maintenant définir des points d'arrêt, des étapes, etc. sur n'importe laquelle des autres fonctions (elles utilisent toutes le même processus).

Il y a probablement une meilleure façon de coller tout cela ensemble.

0
adelphus

Au début, je ne pouvais pas faire marcher le single stepping. Mon processus était le même que celui documenté dans de nombreuses réponses ici.

En outre, ces pages contiennent presque toute la documentation dont j'avais besoin:

Les fonctions fonctionnaient avec firebase serve --only functions, mais le débogueur n’était pas opérationnel. Ensuite, je suis tombé sur l’autre façon d’utiliser directement l’émulateur et ai réussi à atteindre un point de rupture comme celui-ci:

# start the emulator
functions start

# allow inspection
functions inspect helloWorld

# call the function from the cli
functions call helloWorld

Cela a fonctionné et je pouvais atteindre un point d'arrêt.

Cependant, lorsque je clique sur le noeud final de la fonction dans postman ou le navigateur, je n’ai aucune réponse.

L'étape qui me manquait était:

# deploy the function to the emulator
functions deploy helloWorld --trigger-http

# you need to toggle inspection after the deploy
functions inspect helloWorld

Maintenant, je peux atteindre le point de terminaison pour la fonction de postier ou du navigateur, et le point d'arrêt est atteint.

Je recommande le brillant extension NiM chrome pour le débogage et j'espère que cette réponse aidera quelqu'un, même s'il s'agit d'une vieille question.

0
plumpNation

Tout d'abord, je vous suggère d'installer les dépendances suivantes,

npm install --save firebase-functions
npm install -g firebase-tools 

Si déjà installé, vous pouvez le mettre à jour au plus récent. En règle générale, functions-emulator est associé à la dépendance ci-dessus, mais je vous recommande néanmoins de le mettre à jour

npm install -g @google-cloud/functions-emulator

Une fois qu'il a été mis à jour, accédez au dossier des fonctions de votre application et exécutez la commande suivante,

firebase serve --only functions

J'espère que ça aide!

0
imbond