从Firebase提取数据-Google云功能

时间:2018-07-14 15:19:32

标签: node.js firebase firebase-realtime-database google-cloud-firestore google-cloud-functions

我正在尝试使用几个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()。

如果有人对此错误有任何建议,请发表评论!

2 个答案:

答案 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;
});