如何使用Firebase Cloud函数对用户进行计数(使函数返回未定义错误)

时间:2018-08-21 15:31:58

标签: firebase google-cloud-functions

我有一个Firebase Cloud Function,它为onWrite上的用户分配一个号码。以下代码有效,但出了点问题,因为控制台的日志状态为Function returned undefined, expected Promise or value

我也不确定如何从onWrite内部引用根,因此我创建了几个相互引用的“父”条目。我敢肯定有更好的方法。

onWrite对此触发:

/users/{uid}/username

触发器计算/ usernumbers中的子代数,然后在此处写一个条目,其中包含uid和子代数+ 1:

/usernumbers/uoNEKjUDikJlkpLm6n0IPm7x8Zf1 : 5

云功能:

'use strict';

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

exports.setCount = functions.database.ref('/users/{uid}/username').onWrite((change, context) => {
    const uid = context.params.uid;
    const parent1 = change.after.ref.parent; //uid
    const parent2 = parent1.ref.parent;      //users
    const parent3usernumbers = parent2.ref.parent.child('/usernumbers/');
    const parent3usernumbersuid = parent2.ref.parent.child('/usernumbers/'+uid);

    parent3usernumbers.once("value")
       .then(function(snapshot) {
       var a = snapshot.numChildren();
       return parent3usernumbersuid.transaction((current) => {
          return (a + 1);
       }).then(() => {
          return console.log('User Number Written', uid, a);
       });
    });
});

有更好的方法吗?如何获得函数返回的未定义错误以消失?

我还要提到,写入“ usernumber”条目需要花费几秒钟的时间。我猜它正在等待函数返回一些东西。

1 个答案:

答案 0 :(得分:2)

您的函数必须返回一个Promise:

exports.setCount = functions.database.ref('/users/{uid}/username').onWrite((change, context) => {
    const uid = context.params.uid;
    const parent1 = change.after.ref.parent; //uid
    const parent2 = parent1.ref.parent;      //users
    const parent3usernumbers = parent2.ref.parent.child('/usernumbers/');
    const parent3usernumbersuid = parent2.ref.parent.child('/usernumbers/'+uid);

    return new Promise((resolve, reject) => {
        parent3usernumbers.once("value").then(function(snapshot) {
           var a = snapshot.numChildren();
           return parent3usernumbersuid.transaction((current) => {
               return (a + 1);
            }).then(() => {
               console.log('User Number Written', uid, a);
               resolve({uid : uid, a : a})
            }).catch(function(e) {
               reject(e)
            })
        });
    });
});