0

FirestoreFirestoreクエリが機能しない

上記は私のFirestoreコレクションです。

私が展開しているGoogleのクラウド機能を使用して、このコレクションからデータを取得しようとしています:

const admin = require('firebase-admin') 
const functions = require('firebase-functions') 

module.exports= function(request, response){ 
    let results = [] 
    admin.firestore().collection('news_stories') 
    .get() 
    .then(docs => docs.map(doc => results.push(doc.data()))) 
    .catch(e => resoponse.status(400).send(e)) 

     response.status(200).send(results) 
} 

私は私が得る上記の関数を実行すると:

Error: could not handle the request

を私も試してみましたこの方法で関数を実行して、それが機能するかどうかを確認します。

module.exports= function(request, response){ 
    let ref = admin.firestore().collection('news_stories') 
    .get() 
    .then(docs => response.status(200).send(docs)) 
    .catch(e => resoponse.status(400).send(e)) 
} 

この関数は、JSONオブジェクトが返されました:

return object

データやドキュメントの任意のについての情報はありません。

私はこの機能を使用してfirestore DBにコレクションをアップロード:

const functions = require('firebase-functions') 
const admin = require('firebase-admin') 

module.exports = function(request,response){ 
    if(!request.body.data){ 
     response.status(422).send({error: 'missing data'}) 
    } 
    let data = request.body.data 
    data.map(item => { 
     admin.firestore().collection('news_stories').add({item}) 
     }) 
    response.status(200).send('success!') 
} 

ない私が間違っているのかわから。関数がドキュメントを返さないのはなぜですか?

答えて

0

データはFirestoreから非同期に取得されます。呼び出し元に返信した時点で、結果はまだFirestoreから取得されていません。

それは3つのログ・ステートメントとコードの大部分を置き換えることによって、これを確認する最も簡単です:

console.log("Before starting get"); 
admin.firestore().collection('news_stories') 
    .get() 
    .then(() => { 
    console.log("In then()"); 
    }); 
console.log("After starting get"); 

あなたが定期的にNode.jsのコマンドでは、代わりのクラウド機能に上記を実行すると、それは最高です後者はデータがロードされる前に実際にコマンドを強制終了する可能性があるためです。上記の

出力は、次のとおりです。おそらくあなたが期待する順序ではありません

Before starting get

After starting get

In then()

。しかし、データはFirestoreから非同期にロードされるので、コールバック関数の後のコードは直ちに続行できます。 Firestoreからデータが戻ってくると、コールバックが呼び出され、必要に応じてデータを使用できます。だから、いくつかのトラブルシューティングの後、私は、問題の原因を見つけ

const admin = require('firebase-admin') 
const functions = require('firebase-functions') 

module.exports= function(request, response){ 
    admin.firestore().collection('news_stories') 
    .get() 
    .then(docs => { 
     let results = [] 
     docs.map(doc => results.push(doc.data())) 
     response.status(200).send(results) 
    }) 
    .catch(e => resoponse.status(400).send(e)) 
} 
+0

は私がステータスの取得に保つ ...私は残念ながらそれはまだNode.jsの環境でもクラウドで、動作していない、コードに編集を行った 、あなたの時間と助けてくれてありがとう500エラーコード... –

+0

これは、確かにあなたの既存のコードのエラーでした。より多くのことがあったかもしれない。 –

+0

私はクラウド関数が動作するようになっています...エラーの原因は.map関数内にあります...一度.mapをforEachに変更すると関数が実行され、データが返されます –

0

ソリューションはにthen()ハンドラをデータを必要とするすべてのコードを移動することです。何らかの理由であなたは500個のステータスで応答するサーバーオブジェクトリターンでの.map使用している場合... 変更のforEachに.MAPと機能が動作します

これは動作します...

admin.firestore().collection('news_stories') 
    .get() 
    .then(docs => { 
     let data = [] 
     docs.forEach(doc => data.push(doc.data())) 
     response.status(200).send(data) 
    }) 

まだこの...

admin.firestore().collection('news_stories') 
     .get() 
     .then(docs => { 
     let data = [] 
     docs.map(doc => data.push(doc.data())) 
     response.status(200).send(data) 
    })