0
  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

回答

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: '[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