Error: no entity to update: app - Firestore Cloud Function
Error: no entity to update: app - Firestore 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()
})
})
我收到错误
Error: no entity to update: app
我的代码有什么问题?
很可能 event.data.uid
的文档不存在。 update() 的文档指出:
The update will fail if applied to a document that does not exist.
改用set()。
我在使用 Firebase 模拟器在本地测试我的应用程序时遇到了类似的错误。我的 firebase 配置文件如下所示:
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");
}
原来我的本地 Firestore 数据库(预计 运行 在 localhost:8080
)没有被攻击。所以我的云函数试图写入 non-existent 数据库。潜在的问题是我的后端也初始化到另一个数据库:
// 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",
});
解决方案(最初 adapted from a Fireship tutorial)是完全删除数据库的这个 [不正确] re-initialization:
// functions/index.js
...
admin.initializeApp();
...
毕竟,according to the docs,我们可以在没有参数的情况下初始化 Firebase Admin SDK,因为 FIREBASE_CONFIG 环境变量自动包含在 Cloud Functions for Firebase 函数中,通过Firebase CLI.
FWIW,还要确保在 CLI 上设置正确的 Firebase 项目。这样做允许 Firebase CLI 挂钩 Functions/Firestore 到正确的项目:
firebase use <desired-firebase-project-id>
如果您有多个 Firebase 项目,您可以列出它们:firebase projects:list
这是我最基本的云功能:
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()
})
})
我收到错误
Error: no entity to update: app
我的代码有什么问题?
很可能 event.data.uid
的文档不存在。 update() 的文档指出:
The update will fail if applied to a document that does not exist.
改用set()。
我在使用 Firebase 模拟器在本地测试我的应用程序时遇到了类似的错误。我的 firebase 配置文件如下所示:
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");
}
原来我的本地 Firestore 数据库(预计 运行 在 localhost:8080
)没有被攻击。所以我的云函数试图写入 non-existent 数据库。潜在的问题是我的后端也初始化到另一个数据库:
// 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",
});
解决方案(最初 adapted from a Fireship tutorial)是完全删除数据库的这个 [不正确] re-initialization:
// functions/index.js
...
admin.initializeApp();
...
毕竟,according to the docs,我们可以在没有参数的情况下初始化 Firebase Admin SDK,因为 FIREBASE_CONFIG 环境变量自动包含在 Cloud Functions for Firebase 函数中,通过Firebase CLI.
FWIW,还要确保在 CLI 上设置正确的 Firebase 项目。这样做允许 Firebase CLI 挂钩 Functions/Firestore 到正确的项目:
firebase use <desired-firebase-project-id>
如果您有多个 Firebase 项目,您可以列出它们:firebase projects:list