blue
blue

Reputation: 7375

Firebase function .onWrite not working?

Ok, I have looked at similar questions like Firebase function onWrite not being called and thought it was my fault getting the reference, but I have no idea what is happening here with my Firebase functions.

I am just trying to get a function to write to my database when a write has been made to database. I followed the firebase tutorial exactly:

const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
//https://firebase.google.com/docs/functions/database-events

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// const gl = require('getlocation');

exports.helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
});

exports.enterLocation = functions.database.ref('/Users/{name}') //brackets is client param
    .onWrite(event => {
      // Grab the current value of what was written to the Realtime Database.
      // const original = event.data.val();
      console.log('SKYLAR HERE:', event.params.name);
      // You must return a Promise when performing asynchronous tasks inside a Functions such as

      return firebase.database().ref('/Users/{name}').set({ location: 'test loc' });
  });

The function is being run, yet in my logs I get a pretty unhelpful error that it is getting the {name} param, and data is definitely written to my database, however my SERVER code is not writing:

enter image description here

I get -

ReferenceError: firebase is not defined at exports.enterLocation.functions.database.ref

Which makes no sense as it is defined. I just want to add an extra child under the user I create, like I do already with "password"

enter image description here

What am I doing wrong?

Upvotes: 0

Views: 1851

Answers (2)

Doug Stevenson
Doug Stevenson

Reputation: 317467

Two problems here. First, you haven't defined firebase anywhere in your code. I think you meant to use admin instead to use the Admin SDK.

Second, it looks like you're trying to do variable interpolation into a string to build the name of the ref. Your syntax is wrong here.

I imagine you're trying to say this instead in your last line of code:

return admin.database().ref(`/Users/${name}`).set({ location: 'test loc' });

Note the backticks on the string quotes. That JavaScript syntax lets you use ${exp} to insert the contents of some expression in the string.

It turns out you don't even need to use the admin SDK here. Since you're trying to write back to the same location that triggered the function, you can just use the ref that comes from the event object:

return event.data.adminRef.set({ location: 'test loc' });

Upvotes: 1

Peter Haddad
Peter Haddad

Reputation: 80914

instead of this:

 return firebase.database().ref('/Users/{name}').set({ location: 'test loc' });

use this:

 return admin.database().ref('/Users/{name}').set({ location: 'test loc' });

Upvotes: 1

Related Questions