2016-04-20 12 views
0

firebaseから値を取得する関数を作成しました。今度は、firebaseクエリの結果を格納した変数は、firebase操作内でのみアクセス可能です。しかし、私は関数の外でこれらの変数を必要とするので、私はこの問題を克服するコールバック関数を作成しました。NodeJSの単一関数で2回コールバックを渡す

私のコードは次のようになります。 私は2つのfirebaseデータベースを持っています。 登録されたユーザー(ref1)と有料ユーザー(payRef)を保存するためのものです。ログインしているユーザーが登録ユーザーか有料ユーザーかを確認する必要があります。

var paidRef=new Firebase("https://app.firebaseio.com/paidUsers"); 
var ref1=new Firebase("https://app.firebaseio.com/tempUser"); 

function checkPaidUsers(res,callback){ 

ref1.orderByChild('userId').equalTo(jsonData.userId).once('child_added', function(snap) { 

registeredUser=true; 
    paidRef.on('child_added',function(snapshot) { 
    if(snapshot.child('userId').val()==jsonData.userId) 
    { 

     paidFlag=true; 
     return callback(registeredUser,paidFlag,res); 
    } 
    else 
    { 

     paidFlag=false; 
     return callback(registeredUser,paidFlag,res); 
    } 

}) 

}) 
} 
checkPaidUsers(res,function(registeredUser,paidFlag) { 

    if(registeredUser!=true) 
    { 
    newUser=true; 


    } 
return res.send({paidFlag:paidFlag,registeredUser:registeredUser,newUser:newUser});}) 

このコードは以下のようにエラーを与える:

Can't set headers after they are sent. 

コールバック関数が無いように何回も呼ばれているので、このエラーが来ています。 moneyRefデータベースにユーザーが見つからない場合は、elseに移動してコールバック関数をブロックして実行するため、paidRefの子があります。 登録されたユーザーのすべての情報と有料のユーザーを1つのコールバック関数から取得するという問題を解決する最良の方法は何ですか?

+0

あなたは 'ref1.orderByChild( 'のuserId')equalTo(jsonData.userId)'でクエリを実行している場合、なぜドン」あなたは自分のユーザーIDのもとでユーザーを格納: '/ tempUsers/$ uid'。 'ref1.child(jsonData.userId).once( 'value'、function(snapshot)){console.log(snapshot.val());})' –

答えて

3

あなたの問題は、あなたの意図ではないと思われるpayRefのすべてのユーザーに対してコールバックを1回呼び出すことです。
このコードはコールバックを1回だけ呼び出す必要があります。

var paidRef=new Firebase("https://app.firebaseio.com/paidUsers"); 
var ref1=new Firebase("https://app.firebaseio.com/tempUser"); 

function checkPaidUsers(res,callback){ 

ref1.orderByChild('userId').equalTo(jsonData.userId).once('child_added', function(snap) { 

registeredUser=true; 
    paidRef.child(jsonData.userId).once('value', function(snapshot) { 
    var paidFlag = false; 
    if (snapshot.val() !== null) { 
     paidFlag = true; 
    } 
    callback(registeredUser, paidFlag, res) 
    }) 
}) 
} 
checkPaidUsers(res,function(registeredUser,paidFlag) { 

    if(registeredUser!=true) 
    { 
    newUser=true; 


    } 
return res.send({paidFlag:paidFlag,registeredUser:registeredUser,newUser:newUser});}) 
+0

ありがとうソリューションのためのPrashanth。出来た。 – Lani

関連する問題