web-dev-qa-db-ja.com

クラウド機能内のクラウドファイヤーストアドキュメントにアクセスする

Google Firebase Firstoreデータベース内で、コレクションに含まれるドキュメントの数などの集約データを収集したいと思います。 Firestoreは集約クエリを提供しないため、コレクションに含まれるドキュメントの数を含むドキュメントがデータベースに追加されるたびにフィールドをインクリメントするクラウド関数を作成しようとしています。

私が抱えている問題は、nodejsを使用してクラウド機能内でFirestoreからドキュメントを取得する方法を自分の人生で把握できないことです。

ここに私がやっていることがあります:

私の_index.jsファイルadmin SDKを設定しますが、これは何が好きですか:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

次に、クラウド機能のためにこれを行います:

exports.createPost = functions.firestore
  .document('posts/{post_id}')
  .onCreate(event => {

    // Get the post object
    var post = event.data.data();

    var senderID = post["sender_id"]; // This is not null

    // Access to user's document and the main ledger document
    const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
    const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');

    return Promise.all([userDocRef, ledgerDocRef]).then(snapshot => {

        const user = snapshot[0].val();
        const ledger = snapshot[1].val();

        console.log("user => "+user); // Logs: user => null
        console.log("ledger => "+ledger); // Logs: ledger => null

        const userPostCount = user["user_name"];
        const globalPostCount = ledger["global_post_count"] + 1;

        const userUpdate = user.update({"post_count" : userPostCount});
        const ledgerUpdate = ledger.update({"global_post_count" : globalPostCount});

        return Promise.all([userUpdate, ledgerUpdate]);
    });
});

私はエラーになります:

TypeError:Promise.all.then.snapshotでnullのプロパティ 'global_post_count'を読み取ることができません

これは、クエリに問題があることを意味しますが、何がわからないのでしょうか。 userspostsは両方ともルートレベルのコレクションです。

また、次のような警告も表示されます。

請求先アカウントが設定されていません。外部ネットワークにはアクセスできず、クォータは厳しく制限されています。

私がオンラインで読んだものから、それがそれをもたらすとは思わないが、私はそれが注目に値すると思った。

助けてください。

9
Garret Kaye

Firestoreトリガーを作成したように見えますが、クエリのためにRealtime Databaseにアクセスしています:

_const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');
_

RTDBが空の場合、これらのクエリも空になります。

Firestoreをクエリするには、admin.firestore()の代わりにadmin.database()を使用する必要があります。 Firestoreには ほとんど異なるAPI (リンクしたばかりのCloud SDK経由)がRTDBよりもありますが、いくつかの点で似ています。

15
Doug Stevenson