J. Doe
J. Doe

Reputation: 13043

Error: no entity to update: app - Firestore Cloud Function

This is my very basic Cloud Function:

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

exports.createdNewAccount = functions.auth.user().onCreate(event => {
    return db.collection('users').doc(event.data.uid).update({
        "creationDate" : Date.now()
    })
})

And I get the error

Error: no entity to update: app

What is wrong with my code?

Upvotes: 16

Views: 16108

Answers (2)

kip2
kip2

Reputation: 6873

I faced a similar error when testing my app locally with the Firebase emulator. My firebase config file looked like:

import firebase from "firebase";
import "firebase/firestore";

const firebaseConfig = {
  apiKey: <FIREBASE_API_KEY>,
  authDomain: <FIREBASE_AUTH_DOMAIN>,
  databaseURL: <FIREBASE_DB_URL>,
  projectId: <FIREBASE_PROJECT_ID>,
  storageBucket: <FIREBASE_STORAGE_BUCKET>,
  messagingSenderId: <FIREBASE_MSG_SENDER_ID>,
  appId: <FIREBASE_APP_ID>,
  measurementId: <FIREBASE_MEASUREMENT_ID>,
};

// Initialize Firebase
const firebaseApp = firebase.initializeApp(firebaseConfig);
// for local instances, use the emulator to connect the frontend to firestore & functions
if (location.hostname === "localhost") {
  firebase.firestore().settings({
    host: "localhost:8080",
    ssl: false,
  });

  firebase.functions().useFunctionsEmulator("http://localhost:5001");
}

Turns out my local Firestore database (expected to be running at localhost:8080) wasn't being hit. So my cloud functions were trying to write to a non-existent db. The underlying issue was that I also had my backend initializing to a different database:

// functions/index.js
const admin = require("firebase-admin");
var serviceAccount = require("./serviceAccount.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://other-firebase-project-id.firebaseio.com",
});

The solution (originally adapted from a Fireship tutorial) was to remove this [incorrect] re-initialization of the database altogether:

// functions/index.js
... 
admin.initializeApp();
... 

After all, according to the docs, we can initialize the Firebase Admin SDK without parameters since the FIREBASE_CONFIG environment variable is included automatically in Cloud Functions for Firebase functions that are deployed via the Firebase CLI.

FWIW, also be sure to set the correct Firebase project on the CLI. Doing so with this allows the Firebase CLI to hook Functions/Firestore to the right project:

firebase use <desired-firebase-project-id>

If you have multiple Firebase projects, you can list them out with: firebase projects:list

Upvotes: 0

Bob Snyder
Bob Snyder

Reputation: 38299

Most likely, the document for event.data.uid does not exist. The documentation for update() states:

The update will fail if applied to a document that does not exist.

Use set() instead.

Upvotes: 26

Related Questions