AdamHurwitz
AdamHurwitz

Reputation: 10364

Unable to Access Firestore Document Within a Firestore Cloud Function

Issue: Type Error

I setup a Firestore Cloud Function to call from my Android app which is being called as expected, however I am unable to access a Firestore document from within the method and receiving a TypeError in the logs.

Attempted Solutions

  1. functions.firestore().document('qa/content/feeds/main/content/'+contentTitle)
  2. functions.firestore().ref('qa/content/feeds/main/content/'+contentTitle)

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

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const MAIN_FEED_TYPE = "MAIN";
const SAVED_FEED_TYPE = "SAVED";
const ARCHIVED_FEED_TYPE = "ARCHIVED";
const SAVE_USER_ACTION = "SAVE";
const ARCHIVE_USER_ACTION = "ARCHIVE";
const SAVED_PATH = "saved"
const ARCHIVED_PATH = "archived"

exports.updateQualityScore = functions.https.onCall((data, context) => {
    const environment = data.environment
    const feedType = data.feedType
    const action = data.action
    const contentTitle = data.contentTitle
    const uid = context.auth.uid;

    var feedTypePath
    if (feedType === SAVED_FEED_TYPE) {
        feedTypePath = SAVED_PATH
    } else if (feedType === ARCHIVED_FEED_TYPE) {
        feedTypePath = ARCHIVED_PATH
    }

    admin.firestore().ref('qa/content/feeds/main/content/'+contentTitle)
        .get().then(function(doc) {
            console.log('Trigger fired on content: ' 
                +  contentTitle +  " | user: " + uid
                + " | action: " + action + ' | feedType: ' + feedType);
            if (doc.exists) {
                console.log("Document data:", doc.data());
            } else {
                console.log("No such document!");
            }
            return {
                status: 'Get content success.'
             }
        }).catch(function(error) {
            console.log("Error getting document:", error);
            return {
                status: 'Get content error.'
            }
        });
});

Upvotes: 0

Views: 655

Answers (2)

Puni
Puni

Reputation: 1294

Sorry wrong answer.

You need to pass credential when initializing app.

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

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

var db = admin.firestore();

or

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: '<PROJECT_ID>',
    clientEmail: 'foo@<PROJECT_ID>.iam.gserviceaccount.com',
    privateKey: '-----BEGIN PRIVATE KEY-----\n<KEY>\n-----END PRIVATE KEY-----\n'
  }),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

initialize the sdk Quick Start

Upvotes: 0

Doug Stevenson
Doug Stevenson

Reputation: 317467

Firestore doesn't have a ref() method. Realtime Database does. You're probably confusing the two.

With Firestore, you deal with collections and documents, and there are different methods to get a hold of collection and document references. Maybe you meant to use the doc() method instead, like this?

admin.firestore().doc('qa/content/feeds/main/content/'+contentTitle)

Upvotes: 2

Related Questions