【问题标题】:Firebase Cloud Functions : Accessing Data from a different nodeFirebase Cloud Functions:从不同的节点访问数据
【发布时间】:2017-10-13 05:55:02
【问题描述】:
  1. 尝试实现:通过firebase云功能从单独的节点提取数据
  2. Process: onCreate on /users/{uid} ,它给了我一个 managedby 键,我使用它访问另一个 /users/uid。
  3. 错误:(错误 1):TypeError 无法读取 null 的属性“名称”。 (更新 1):代码有两个问题(a)我没有为 ${managedby} 使用 $ 符号,第二个问题没有在 const managerVal 中使用“.then”。 (错误2):抛出的新错误是:admin.database.ref(..).then 不是exports.sendWelcomeEmail 的函数...我在其他地方读到我们不应该在函数之间使用admin。那有什么选择呢?错误 3:查看下面的错误 2 更新。我认为这一定是小问题造成的。
  4. 名称有值。这里有什么根本错误吗? (清除。阅读更新 1)

        admin.initializeApp(functions.config().firebase);
        // // Create and Deploy Your First Cloud Functions
        // // https://firebase.google.com/docs/functions/write-firebase-functions
        //
        // exports.helloWorld = functions.https.onRequest((request, response) => {
        //  response.send("Hello from Firebase!");
        // });
    
        exports.sendWelcomeEmail = functions.database.ref('/users/{uid}').onWrite(event => {
            if (!event.data.exists() || event.data.previous.exists()) {
                return;
            }
    
            var user = event.data.val()
            var {email} = user
            var {managedby} = user
            const managerVal = admin.database().ref(`/users/{managedby}`).on('value', function(snapshot){
                    const managedByName = snapshot.val().name
                    const managedByMobile = snapshot.val().mobile
            });
    
    
            console.log(email)
    
            var data = {
    
                from: 'no-reply@firebaseapp.com',
                subject: 'From Your Admin! Please set your Password for your account',
                html: `<p> hello</p>`,
                to: email
            }
    
            mailgun.messages().send(data, function (error, body) {
                console.log(body)
            })
    
        });
    

错误 2:更新:我使用了@faruk 的方法:

var user = event.data.val();
    var email = user.email;
    var managedby = user.managedby;
    const managerVal = db.ref('/users/' + managedby).on('value', function(snapshot){
        console.log("inside the function")
        const managerUser = snapshot.val();
        if(managerUser)
        {
            const managedByName = managerUser.name;
            const managedByMobile = managerUser.mobile;
        }
    });
    console.log("outside the function")

我也试过用.then

var user = event.data.val();
var email = user.email;
var managedby = user.managedby;
const managerVal = db.ref('/users/' + managedby).once('value')
    .then((snapshot) => {
    console.log("inside the function")
    const managerUser = snapshot.val();
    if(managerUser)
    {
        const managedByName = managerUser.name;
        const managedByMobile = managerUser.mobile;
    }
});

console.log("outside the function")

现在的问题是,“函数外部”部分首先被触发,然后“函数内部”部分被触发。函数内的执行不是在它离开之前先完成了吗?我不知道问题出在哪里。

编辑:Faruk,我已将整个邮件功能放入(复制粘贴)数据库调用中,如您所示。一些非常基本的东西被遗漏了。仍然出现此错误:

错误 2:更新 2:我刚刚使用了 .then,代码是这样的。

 var db = admin.database();
    if (!event.data.exists() || event.data.previous.exists()) {
        return;
    }
    var user = event.data.val();
    var email = user.email;
    var managedby = user.managedby;
    console.log(managedby)
    const managerVal = db.ref('/users/' + managedby).once('value')

    managerVal.then((snapshot) => {
        const managerUser = snapshot.val()
        console.log("inside snapshot")
        if (managerUser) {
            console.log("deep inside snapshot")
            const managedByName = managerUser.name
            const managedByMobile = managerUser.mobile
        }
    })
        console.log("outside snapshot")
        console.log('managerName = ' + managedByName)
        console.log('email = ' + email)

这就是它在仪表板中的显示方式(在下面的屏幕截图中给出)。根据它变得多么复杂,我认为它一定是一个真正简单的解决方案。

【问题讨论】:

  • 请向我们展示您的用户 json 结构
  • 嗨@faruk 有一个更新。这是语法正确的问题。不过我有一个新问题。 ;)

标签: firebase firebase-cloud-messaging google-cloud-functions


【解决方案1】:

也许是这样的:

const admin = require('firebase-admin');
var serviceAccount = require("./serviceAccountKey.json");

//just called once
admin.initializeApp({
   credential: admin.credential.cert(serviceAccount),
   databaseURL: "https://[your_project_id].firebaseio.com"
});

exports.sendWelcomeEmail = functions.database.ref('/users/{uid}').onCreate(event => {
    var db = admin.database();
    if (!event.data.exists() || event.data.previous.exists()) {
        return;
    }

    var user = event.data.val();
    var email = user.email;
    var managedby = user.managedby;
    const managerVal = db.ref('/users/' + managedby).on('value', function(snapshot){
            const managerUser = snapshot.val();
            var managedByName;
            var managedByMobile;
            if(managerUser)
            {
              managedByName = managerUser.name;
              managedByMobile = managerUser.mobile;
            }
            console.log('managerName = ' + managedByName);
            console.log('email = ' + email);

            var data = {
               from: 'no-reply@firebaseapp.com',
               subject: 'From Your Admin! Please set your Password for your account',
               html: `<p> hello</p>`,
               to: email
            }

            mailgun.messages().send(data, function (error, body) {
              console.log(body)
            })

    });


});

on Value 总是异步工作

【讨论】:

  • 是否有管理数据库模块?我现在检查一下edit 对不起,我的错。
  • 嗨@faruk,我已经根据我得到的信息更新了错误。
  • 我已经更新了我的答案,on Value 事件正在异步查询数据库,所以如果您需要在查询过程之后执行一些操作,您需要将其放入函数中(快照)
  • 试过了。还是报错。我已经发布了屏幕截图。
  • 嗨。有效!谢谢。顺便说一句,我不得不问.. 修改是什么?你已经提出了 var managedByName; var managedByMobile;之前..还有别的吗?
猜你喜欢
  • 2017-10-17
  • 2018-11-23
  • 2022-12-05
  • 2020-02-01
  • 2017-09-24
  • 2020-09-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多