Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to test Cloud Functions for Firebase locally on pc

Today Firebase released its brand new product Cloud Functions for Firebase and I just created a hello world function and deploy it on my existing firebase project.

It looks like it bundles all dependencies and upload it to firebase just like aws lambda function does. But it takes too much time to be done even on minor changes in code and also need a good connectivity of internet . If you are offline for some reason, you are just in dark what code you are writing until you have a way to execute and test that functions offline on your local machine.

Is there any way to test Cloud Functions for Firebase locally?

like image 205
Inzamam Malik Avatar asked Mar 10 '17 19:03

Inzamam Malik


People also ask

Can I test Cloud Functions locally?

Each Branch represents a Cloud Function. You can test or run this cloud function locally before. Once development is complete, this Cloud Function is deployed to the Google Cloud Function Service using the Google Cloud Build Service. Your development is thus directly connected to the provided function, so to speak.

Can Firebase be used locally?

The Firebase Local Emulator Suite is a set of advanced tools for developers looking to build and test apps locally using Cloud Firestore, Realtime Database, Cloud Storage, Authentication, Cloud Functions, Pub/Sub, Firebase Hosting and Firebase Extensions.


2 Answers

firebaser here

Deployment of your Functions indeed takes more time than what I'm normally willing to wait for. We're working hard to improve that and (as Brendan said) are working on a local emulator.

But for the moment, I mostly write my actual business logic into a separate Node script first. That way I can test it from a local command prompt with node speech.js. Once I'm satisfied that the function works, I either copy/paste it into my actual Functions file or (better) import the speech module into my functions file and invoke it from there.

One abbreviated example that I quickly dug up is when I was wiring up text extraction using the Cloud Vision API. I have a file called ocr.js that contains:

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; 

And then in my Functions index.js, I have:

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 });   }); }); 

So as you can see this last file is really just about wiring up the "worker method" ocr.extract_text to the database location.

Note this is a project from a while ago, so some of the syntax (mostly the functions.env part) might have changed a bit.

like image 123
Frank van Puffelen Avatar answered Oct 01 '22 23:10

Frank van Puffelen


firebaser here

To debug your Cloud Functions for Firebase locally, there is an emulator. See the documentation for more info.

like image 38
Brendan G. Lim Avatar answered Oct 01 '22 23:10

Brendan G. Lim