火力地堡云功能:从不同的节点

问题描述:

  1. 访问数据试图实现:从经由火力云功能
  2. 一个单独的节点提取数据
  3. 过程:的onCreate上/用户/ {UID},这使我一个managedby密钥,使用它我访问另一个/ users/uid。
  4. 错误:(错误1):TypeError无法读取null的属性'name'。 (更新1):代码有两个问题(a)我没有在$ {managedby}中使用$符号,而第二个在const managerVal中没有使用“.then”。 (错误2):抛出的新错误是:admin.database.ref(..)。然后不是一个函数在exports.sendWelcomeEmail ...我读过其他地方,我们不应该使用admin之间的函数。什么是替代呢?错误3:请看下面的错误2更新。我认为这一定是小事情造成的。
  5. 名称的值为。这里有什么根本性的错误吗? (清除读取,更新,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: '[email protected]', 
          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:更新:我已经使用@法鲁克的方法:

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") 

我也曾尝试使用。于是

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") 

现在的问题是,“功能外”部分先被触发,然后“功能内”部分被触发。在它离开之前,它是否在第一个完成的功能中执行?我不知道问题在哪里。

The screegrab from the firebase console

编辑:法鲁克,我已经把(复制粘贴)你有节目数据库调用内的整个邮件功能。一些非常基本的东西正在被遗漏。仍然得到这个错误:

enter image description here

错误2:更新2:我刚使用。那么,代码是这样的。

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) 

这就是它在仪表板中的特色(在下面的屏幕截图中给出)。通过它的复杂程度,我认为它必定是一个真正简单的解决方案。

enter image description here

+0

,请告诉我们您的用户JSON结构 – faruk

+0

喜@faruk出现了更新。它是一个问题与正确的语法。但我有一个新问题。 ;) – user165242

也许是这样的:

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: '[email protected]', 
       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始终异步工作

+0

有没有管理数据库模块?我现在检查这个[编辑]对不起,我的坏。 – user165242

+0

嗨@faruk,我根据我得到的更新了错误。 – user165242

+0

我已经更新了我的答案,'Value'事件是异步查询数据库的,所以如果你需要在查询过程后执行一些操作,你需要把它放在函数内部(快照) – faruk