12

私は、2つのリストを相互参照し、リスト全体で互いに一致する値を見つけるのにクラウド関数を使用しています。関数は正常に動作しているようですが、ログでは私はこれを見て続けますError serializing return value: TypeError: Converting circular structure to JSON。ここで私はcompletionRef.set(matchedContacts);の前でreturnを入れてみまし機能...Firebaseのクラウド関数 - 戻り値のシリアル化エラーのエラー:

exports.crossReferenceContacts = functions.database.ref('/cross-ref-contacts/{userId}').onWrite(event => { 

    if (event.data.previous.exists()) { 
     return null; 
    } 

    const userContacts = event.data.val(); 
    const completionRef = event.data.adminRef.root.child('completed-cross-ref').child(userId); 
    const removalRef = event.data.ref; 

    var contactsVerifiedOnDatabase ={}; 
    var matchedContacts= {}; 


    var verifiedNumsRef = event.data.adminRef.root.child('verified-phone-numbers'); 
    return verifiedNumsRef.once('value', function(snapshot) { 

     contactsVerifiedOnDatabase = snapshot.val(); 

     for (key in userContacts) { 
      //checks if a value for this key exists in `contactsVerifiedOnDatabase` 
      //if key dioes exist then add the key:value pair to matchedContacts 
     }; 

     removalRef.set(null); //remove the data at the node that triggered this onWrite function 
     completionRef.set(matchedContacts); //write the new data to the completion-node 

    }); 

}); 

はあるが、それはまだ私にエラーを与えます。私が間違ってやっていることとそのエラーを取り除く方法をよく分からない。ご協力いただきありがとうござい

答えて

0

してみてください。

Firebaseデータベース上のトランザクションた複数の約束を返すときに、私は正確に同じ問題を抱えていた
return verifiedNumsRef.once('value').then(function(snapshot) { 
    contactsVerifiedOnDatabase = snapshot.val(); 

    for (key in userContacts) { 
     //checks if a value for this key exists in `contactsVerifiedOnDatabase` 
     //if key dioes exist then add the key:value pair to matchedContacts 
    }; 

    return Promise.all([ 
     removalRef.set(null), //remove the data at the node that triggered this onWrite function 
     completionRef.set(matchedContacts) 
    ]).then(_ => true); 
}); 
+0

私はこれを試します。 'Promise.all([...])が何であるか説明できますか? – MikeG

+1

@MikeG約束とクラウド機能との関係については、埋め込みビデオを使用したこのブログをご覧ください:https://firebase.googleblog.com/2017/06/keep-your-promises-when-using-cloud.html –

+1

@MichaelBleighこれを試した後も同じエラーが表示されます。 – MikeG

7

。最初は私が呼んでいた。

return Promise.all(promises); 

マイpromisesオブジェクトは、私がpromises.push(<add job here>)を呼び出して実行する必要があるすべてのジョブをプッシュするよどこ私が使用している配列です。ジョブが並行して実行されるので、これがジョブを実行する有効な方法だと思います。

クラウド機能は働いていましたが、あなたが説明したのとまったく同じエラーが発生していました。

return Promise.all(promises).then(() => { 
    return true; 
}).catch(er => { 
    console.error('...', er); 
}); 

それはあなたの問題を解決しない場合は、多分あなたはあなたを変換する必要があります:マイケルBleighはthenは、問題を修正しないと私はもはやそのエラーを見ています追加して、彼のコメントで示唆したよう

しかし、循環オブジェクトをJSON形式に変換します。ここに例が書かれていますが、私はそれを試していません:https://stackoverflow.com/a/42950571/658323(これはcircular-jsonライブラリを使用しています)。

UPDATE 2017年12月:Function returned undefined, expected Promise or value機能はしますが:最新のクラウド機能のバージョンでは、クラウド機能は、(いずれかの約束または値)は、そうreturn;は、次のエラーが発生します戻り値を期待することが表示されます実行される。したがって、約束を返さずにクラウド関数を終了させたい場合は、ランダムな値を返すことができます。 return true;

+1

Dec 2011年12月のアップデートに感謝します! – johnozbay

0

私は非常によく似たセットアップで同じエラー出力を持ちましたが、このエラーを取り除く方法を理解できませんでした。 私はすべてのエッセンスが以前の回答によって取り込まれているかどうかは完全にはわかりませんので、私はあなたに私の解決策を残しています。

もともと私のコードは次のように見えた:

return emergencyNotificationInformation.once('value', (data) => { 
    ... 
    return; 
}); 

しかし、その後の追加と離れて行ったのエラーをキャッチした後。

return emergencyNotificationInformation.once('value') 
    .then((data) => { 
     ... 
     return; 
    }) 
    .catch((error) => { 
     ... 
     return: 
    }); 
} 
関連する問題