我正在尝试使用几个Google Cloud Functions在Firebase和Firestore之间同步数据。
我做了一个Cloud功能,用于使用Firebase中的新数据更新Firestore,并在Firestore中创建时触发。效果很好!
但是,当我尝试使用
admin.database().ref('etc etc..').get().then(...)
代替
admin.firestore().doc('etc etc..').get().then(...)
当调用云功能时,我收到一条错误日志:
TypeError:admin.database(...)。ref(...)。get在导出时不是函数.UpdateFirebase.functions.firestore.document.onCreate(/user_code/index.js:27:68)在对象。 (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:112:27)在(native)在__awaiter的/user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71 (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)位于/ var /处的cloudFunction(/user_code/node_modules/firebase-functions/lib/cloud-functions.js:82:36)在process._tickDomainCallback处的tmp / worker / worker.js:728:24(internal / process / next_tick.js:135:7)
这是我已部署为Google Cloud Function的已发布代码:
exports.UpdateFirebase = functions.firestore.document('/commands/{pushId}')
.onCreate((snapshot, context) => {
admin.database().ref('/commands/' + context.params.pushId).get().then(doc => {
if (!doc.exists) {
return admin.database().ref('/commands/' + context.params.pushId).set(snapshot);
}
else return null;
}).catch((fail) => {
console.log(fail.message);
})
});
这是工作示例,反之亦然:
exports.UpdateFirestore = functions.database.ref('/commands/{pushId}')
.onCreate((snapshot, context) => {
admin.firestore().doc('/commands/' + context.params.pushId).get().then(doc => {
if (!doc.exists) {
return admin.firestore().doc('/commands/' + context.params.pushId).set(snapshot.val());
}
else return null;
}).catch((fail) => {
console.log(fail.message);
})
});
我一直在搜索没有答案,但是想要从Google Cloud Function检索内容或将内容写入firebase时使用admin.database()。
如果有人对此错误有任何建议,请发表评论!
答案 0 :(得分:0)
请阅读reading and writing Realtime Database上的文档。 Reference上没有get()
方法,就像DocumentReference一样。要从实时数据库中读取数据,请使用once()方法,并将其传递给"value"
以获得通过数据快照解析的承诺。
答案 1 :(得分:0)
我找到了问题。
我必须使用引用(ref)和子元素,而不是使用get()然后then(...)
这是有效的Cloud Function代码,如果不存在来自Firestore快照的具有给定文档ID的对象,则在Firestore中触发onCreate,在Firebase中创建JSONObject:
exports.UpdateFirebase = functions.firestore.document('/commands/{pushId}')
.onCreate((snapshot, context) => {
const ref = admin.database().ref('/commands/');
if (!ref.child(context.params.pushId).exists) {
return ref.child(context.params.pushId).set(snapshot.data());
}
else return null;
});