0
  1. 達成しよう:別のノードから抽出データfirebaseクラウド機能
  2. プロセスを介し:のonCreateオン/ユーザー/ {UID}、私を与えます私が別の/ users/uidにアクセスするのに使うmanagedby鍵。
  3. エラー:(エラー1):TypeErrorはnullのプロパティ 'name'を読み取ることができません。 (UPDATE 1):コードに2つの問題がありました。(a)$ {managedby}に$記号を使用せず、もう1つはconst managerValに ".then"を使用していませんでした。 (エラー2):新しいエラーは次のようになります:admin.database.ref(..)。次にexports.sendWelcomeEmailの関数ではありません。私は関数の中でadminを使うべきではないと他の場所で読んでいます。その代わりに何がありますか?エラー3:下記のエラー2のアップデートを見てください。私はそれがこの原因となる小さなものでなければならないと考えています。
  4. 名前の値はです。根本的に何か根本的なものがありますか? (クリアUPDATE 1をお読みください。)Firebaseクラウド機能:データへのアクセス別のノードから

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

ERROR 2:UPDATE:私はファルクの方法@使用している:

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") 
を使用しようとしました

問題は今、「機能の外部」部分が最初に起動され、次に「機能の内部」部分が起動されているということです。関数内での実行が最初に完了してから離れる前に実行されていませんか?私は問題がどこにあるのか知りません。

The screegrab from the firebase console

編集:ファルクあなたがショーを持っているように、私は、データベース呼び出し内(コピーが貼り付けられた)全体のメーラー機能を入れています。非常に基本的なものが見逃されています。それでもこのエラーが出る:

enter image description here

エラー2:UPDATE 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) 

これは、ダッシュボードに表示される方法です(下のスクリーンショットに示されています)。どの程度複雑になっていくのか、私は本当に簡単な解決策でなければならないと思う。

enter image description here

+0

こんにちは@faruk ..それがあった更新があった – faruk

+0

JSON構造私達にあなたのユーザーを表示してください仕事は常にあります適切な構文の問題。私は新しい問題を抱えています。 ;) – 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

私の答えを更新しました。 'on Value'イベントはデータベースを非同期に照会していますので、クエリ処理後に何らかのアクションを実行する必要がある場合は、関数(スナップショット)に入れてください。 – faruk

関連する問題