Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase HTTP Cloud Functions - Read database once

Tags:

I have a Firebase HTTPs function. The function needs to read a value from a Firebase database based on the query parameter, and return a result based on this data.

The Firebase JS SDK says to do this using:

return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {   var username = snapshot.val().username;   // ... }); 

However, the Cloud functions examples have:

var functions = require('firebase-functions');  functions.database.ref('/'); 

But the DB reference doesn't have the method once, only onWrite (https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder). This is obviously for DB write functions, rather than HTTP functions.

Is there a correct way to read from the database once in a HTTP function? Can I use the normal Firebase SDK, or is there a better way?

Thanks.

like image 720
SteveEdson Avatar asked May 11 '17 10:05

SteveEdson


People also ask

What is the difference between onCall HTTP callable and onRequest HTTP request Functions?

onRequest creates a standard API endpoint, and you'll use whatever methods your client-side code normally uses to make. HTTP requests to interact with them. onCall creates a callable. Once you get used to them, onCall is less effort to write, but you don't have all the flexibility you might be used to.

Does Firebase scale automatically?

Automatic Scaling Additionally, the API functions of firebase are designed in order to scale linearly with the size of data being synchronized. It handles the scaling operations. Your application will scale from its first user to its first million user without any change in the code.

Can you use Firebase Functions with Realtime Database?

With Cloud Functions, you can handle events in the Firebase Realtime Database with no need to update client code. Cloud Functions lets you run Realtime Database operations with full administrative privileges, and ensures that each change to Realtime Database is processed individually.

What is simultaneous connections in Firebase?

A simultaneous connection is equivalent to one mobile device, browser tab, or server app connected to the database. This isn't the same as the total number of users of your app, because your users don't all connect at once.


2 Answers

I found the solution in combining the answer here on how to get the parameter and an answer from Michael Blight to How to run query from inside of Cloud function?

The answer there also shows what is required to use firebase-admin.

The following works for me when calling my-project.firebaseapp.com/event/123/.

var functions = require('firebase-functions'); const admin = require('firebase-admin');  admin.initializeApp(functions.config().firebase);  exports.showEvent = functions.https.onRequest((req, res) => {     const params = req.url.split("/");     const eventId = params[2];     return admin.database().ref('events/' + eventId).once('value', (snapshot) => {         var event = snapshot.val();         res.send(`             <!doctype html>             <html>                 <head>                     <title>${event.name}</title>                 </head>                 <body>                     <h1>Title ${event. name} in ${event.city}</h1>                 </body>             </html>`         );      }); }); 
like image 159
MGR Programming Avatar answered Oct 24 '22 09:10

MGR Programming


You're confusing two parts:

  • the firebase-functions module, which contains the logic to trigger based on database calls with functions.database.ref('/path').onWrite().
  • the firebase-admin module, which allows your function to call into the database.

Since you have a HTTP function, you should trigger as the documentation for HTTP functions shows:

exports.data = functions.https.onRequest((req, res) => {   // ... }); 

Then in your function, you access the database as the documentation for the Admin SDK shows:

return admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {   var username = snapshot.val().username;   // ... }); 

So in total:

exports.date = functions.https.onRequest((req, res) => {   admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {     var username = snapshot.val().username;     res.status(200).send(username);   }); }); 

Note that this is a tricky pattern. The call to the database happens asynchronously and may take some time to complete. While waiting for that, the HTTP function may time out and be terminated by the Google Cloud Functions system. See this section of the documentation.

As a general rule I'd recommend using a Firebase Database SDK or its REST API to access the database and not rely on a HTTP function as middleware.

like image 39
Frank van Puffelen Avatar answered Oct 24 '22 08:10

Frank van Puffelen