Heute hat Firebase sein brandneues Produkt Cloud Functions für Firebase veröffentlicht, und ich habe gerade eine Hello World-Funktion erstellt und in meinem vorhandenen Firebase-Projekt implementiert.
Es sieht so aus, als würde es alle Abhängigkeiten bündeln und in die Firebase hochladen, genau wie aws lambda function. Es dauert jedoch zu viel Zeit, um selbst bei geringfügigen Codeänderungen und einer guten Internetverbindung zu arbeiten. Wenn Sie aus irgendeinem Grund offline sind, wissen Sie gerade nicht, welchen Code Sie schreiben, bis Sie die Möglichkeit haben, die Funktionen offline auf Ihrem lokalen Computer auszuführen und zu testen.
Gibt es eine Möglichkeit, Cloud-Funktionen für Firebase lokal zu testen?
Feuerball hier
Die Bereitstellung Ihrer Funktionen dauert tatsächlich länger als das, worauf ich normalerweise warten möchte. Wir arbeiten hart daran, das zu verbessern und arbeiten (wie Brendan sagte) an einem lokalen Emulator.
Aber im Moment schreibe ich meine eigentliche Geschäftslogik zuerst in ein separates Node-Skript. Auf diese Weise kann ich es mit einem node speech.js
von einem lokalen Befehl aus testen. Sobald ich mit der Funktion zufrieden bin, kopiere oder füge ich sie in meine eigentliche Funktionsdatei ein oder importiere (besser) das speech
-Modul in meine Funktionsdatei und rufe es von dort auf.
Ein abgekürztes Beispiel, das ich schnell herausgearbeitet habe, ist die Verdrahtung der Textextraktion mit der Cloud Vision-API. Ich habe eine Datei namens ocr.js
, die enthält:
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;
Und dann in meinen Funktionen index.js habe ich:
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 });
});
});
Wie Sie sehen können, handelt es sich bei der letzten Datei also nur um die Verknüpfung der "Workermethode" ocr.extract_text
mit dem Datenbankspeicherort.
Beachten Sie, dass dies ein Projekt von vor einiger Zeit ist, daher haben sich einige der Syntax (meistens der functions.env
-Teil) möglicherweise etwas geändert.
Feuerball hier
Um Ihre Cloud-Funktionen für Firebase lokal zu debuggen, gibt es einen Emulator. In der Dokumentation finden Sie weitere Informationen .
https://firebase.google.com/docs/functions/local-emulator
Um diese Funktion verwenden zu können, müssen Firebase-Tools über die Mindestversion 3.8.0 .__ verfügen. und das Firebase-Funktions-SDK muss mindestens Version 0.5.7 haben. Aktualisieren Führen Sie in beiden Fällen die folgenden Befehle im Verzeichnis Functions/Ihres Projekts aus:
npm install --save firebase-functions npm install -g firebase-tools
Um Funktionen lokal auszuführen, verwenden Sie den Firebase-Server:
firebase serve --only functions # to only emulate functions
Vorsicht: Experimentelles Feature. Dies ist eine experimentelle Funktion, die derzeit nur die Emulation von HTTPS-Funktionen unterstützt.
UPDATE:
Hey Functions Trusted Tester,
Wir haben gerade firebase-tools v3.11.0 veröffentlicht, die ein interaktives .__ unterstützen. Shell zum Emulieren aller Arten von Funktionen und Aufrufen mit Testdaten. Vielen Dank für Ihre Teilnahme an Feedback Sitzungen zu dieser Funktion.
In unserer Dokumentation erfahren Sie, wie Sie diese aufregende neue Funktion verwenden können!
https://firebase.google.com/docs/functions/local-emulator#use_the_cloud_functions_Shell
Hier beantwortet: https://github.com/firebase/firebase-functions/issues/4#issuecomment-286515989
Google Cloud-Funktionen haben auch einen lokalen Emulator auf Open Source-Basis bereitgestellt. Arbeiten Sie an einer engeren Integration mit Cloud-Funktionen für Firebase In der Zwischenzeit können Sie es hier überprüfen: https://github.com/GoogleCloudPlatform/cloud-functions-emulator/
Mit dem Emulator können Sie Funktionen lokal ausführen. Hier ist die Dokumentation, die die Verwendung erläutert: https://cloud.google.com/functions/docs/emulator
Für vscode-Benutzer, die HTTP-Funktionen (Webhooks usw.) debuggen ...
Der Google Cloud-Emulator (firebase serve --only functions
) startet einen separaten Prozess zum Ausführen Ihrer Funktionen. Sie können mit vscode eine Verbindung zu diesem Prozess herstellen. Da der Emulator jedoch nur diesen Prozess erstellt after die erste Funktion aufgerufen wird, ist dies nicht einfach.
app.get("/processid", function(request, response) {
response.send(`${process.pid}`);
});
firebase serve --only functions
http://<localhost_url>/processid
-Endpunkt auf. Dadurch wird der Prozess erstellt und die Prozess-ID zurückgegebenEs gibt wahrscheinlich eine schönere Art, all das zusammenzukleben.
Ich konnte den Einzelschritt zunächst nicht zum Laufen bringen. Mein Prozess war der gleiche wie in vielen Antworten hier dokumentiert.
Diese Seiten enthalten auch fast alle erforderlichen Dokumentationen:
Ich hatte die Funktionen mit firebase serve --only functions
ausgeführt, den Debugger jedoch nicht in Betrieb genommen. Dann kam ich auf die andere Art, den Emulator direkt zu verwenden, und erreichte einen Haltepunkt wie diesen:
# start the emulator
functions start
# allow inspection
functions inspect helloWorld
# call the function from the cli
functions call helloWorld
Das funktionierte und ich konnte einen Haltepunkt erreichen.
Beim Erreichen des Endpunkts für die Funktion im Postboten oder im Browser erhielt ich jedoch keine Antwort.
Der Schritt, den ich vermisst habe, war:
# deploy the function to the emulator
functions deploy helloWorld --trigger-http
# you need to toggle inspection after the deploy
functions inspect helloWorld
Jetzt kann ich den Endpunkt für die Funktion vom Postboten oder vom Browser erreichen, und der Haltepunkt ist erreicht.
Ich empfehle die brillante NiM-Chrom-Erweiterung zum Debuggen und hoffe, diese Antwort hilft jemandem, auch wenn dies eine alte Frage ist.
Zuerst schlage ich vor, folgende Abhängigkeiten zu installieren:
npm install --save firebase-functions
npm install -g firebase-tools
Wenn bereits installiert, können Sie es auf den neuesten Stand bringen. Im Allgemeinen ist der Funktionsemulator mit der oben genannten Abhängigkeit ausgestattet, dennoch würde ich Ihnen empfehlen, ihn zu aktualisieren.
npm install -g @google-cloud/functions-emulator
Wechseln Sie nach der Aktualisierung zum Funktionsordner Ihrer Anwendung und führen Sie den folgenden Befehl aus:
firebase serve --only functions
Ich hoffe, es hilft!