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?
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é.
firebaser ici
Pour déboguer vos fonctions Cloud pour Firebase localement, vous devez utiliser un émulateur. Voir le documentation pour plus d’informations .
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
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
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.
app.get("/processid", function(request, response) {
response.send(`${process.pid}`);
});
firebase serve --only functions
http://<localhost_url>/processid
. Cela va créer le processus et renvoyer l'ID de processusIl y a probablement une meilleure façon de coller tout cela ensemble.
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.
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!