winston
winston

Reputation: 3100

Cloud Function for Firebase Type Error - Cannot Read Property

I'm trying to write a Cloud Function that creates a record whenever someone uses our legacy app to create a record (we have changed the Firebase backend architecture and want to slowly migrate users). However, I'm getting the following error in my logs:

TypeError: Cannot read property 'update' of undefined
    at exports.makeNewComment.functions.database.ref.onWrite.event (/user_code/index.js:14:92)
    at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:35:20
    at process._tickDomainCallback (internal/process/next_tick.js:129:7)

Here is the script in question:

//required modules
var functions = require('firebase-functions');
const admin = require('firebase-admin');

// Listens for new comments added to /comments/ and adds it to /post-comments/

exports.makeNewComment = functions.database.ref('comments/{commentId}').onWrite(event => {
  // Grab the current value of what was written to the Realtime Database.
  const commentId = event.params.commentId;
  const comment = event.data.val();
  // You must return a Promise when performing asynchronous tasks inside a Functions such as
  // writing to the Firebase Realtime Database.
  //return event.data.ref.parent.child('post-comments').set(comment);
  return functions.database.ref('post-comments/' + comment['postID'] + '/' + commentId).update(comment).then(url => {
    return functions.database.ref('user-comments/' + comment['postedBy'] + '/' + commentId).update(comment);
  });
});

//initialize
admin.initializeApp(functions.config().firebase);

Thanks!

Upvotes: 0

Views: 2779

Answers (2)

Callam
Callam

Reputation: 11539

Based on Doug's answer, you can replace functions.database.ref with event.data.ref.root.

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

exports.makeNewComment = functions.database.ref('comments/{commentId}').onWrite(event => {

  const commentId = event.params.commentId;
  const comment = event.data.val();

  return event.data.ref.root.child('post-comments/' + comment['postID'] + '/' + commentId).update(comment).then(url => {
    return event.data.ref.root.child('user-comments/' + comment['postedBy'] + '/' + commentId).update(comment);
  });
});

admin.initializeApp(functions.config().firebase);

Upvotes: 1

Doug Stevenson
Doug Stevenson

Reputation: 317332

You can't use functions.database.ref() in the middle of a function to get a ref to somewhere in your database. That's only for defining a new Cloud Function.

If you want a ref to somewhere in your database, you can use event.data.ref or event.data.adminRef to get a ref to the location where the event triggered. You could then use the root property of that to rebuild a new ref to somewhere else in the database. Or you can use your admin object to build a new ref.

It might be helpful to look at some sample code to get a sense of how things work.

Upvotes: 3

Related Questions