Возврат QuerySnapshot из вызываемой облачной функции - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь вернуть QuerySnapshot из вызываемой функции Google Cloud.

Ниже приводятся подробности, но мой основной вопрос: стоит ли ожидать, что я смогу это сделать или это ошибка?

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import * as firestore from '@google-cloud/firestore';

export const callableTest = functions.https.onCall(
    async (data: Map<string, any>, context: functions.https.CallableContext):
        Promise<firestore.QuerySnapshot> => {
        const db = admin.firestore();
        return db.collection('test')
            .get();

        // I also tried this
        //return db.collection('test').get().then(querySnapshot => {
        //    return querySnapshot;
        //});
    });

Коллекция test может содержать любое числодокументов.В этом случае есть два документа.

Вот моя клиентская HTML-страница, но я также пробовал это во Flutter и Node с тем же результатом.

<!DOCTYPE html>
<html>
    <head>
      <script src="https://www.gstatic.com/firebasejs/5.7.3/firebase.js"></script>
      <script>
        // Initialize Firebase
        var config = {
          apiKey: "### API KEY ###",
          authDomain: "<project-id>.firebaseapp.com",
          databaseURL: "https://<project-id>.firebaseio.com",
          projectId: "<project-id>",
          storageBucket: "<project-id>.appspot.com",
          messagingSenderId: "<sender-id>"
        };
        firebase.initializeApp(config);

        var testClientCall = firebase.functions().httpsCallable('callableTest');
        testClientCall ({}).then(function(result) {
          // Read result of the Cloud Function.
          console.log("Cloud Function result:");
          console.log(result);
        });
      </script>
    </head>
    <body></body>
</html>

Этовозвращенный результат, который выглядит как QuerySnapshot, но не содержит DocumentSnapshots (_docs свойство), хотя свойство _size указывает, что должно быть два документа.

{"data":{"_query":{"_firestore":{"_clientPool":{"concurrentOperationLimit":100,"clientFactory":{},"activeClients":{}},"_settings":{"projectId":"<project-id>","firebaseVersion":"6.4.0","libName":"gccl","libVersion":"0.19.0 fire/6.4.0"},"_settingsFrozen":false,"_clientInitialized":{"domain":{"domain":null,"_events":{"error":{}},"_eventsCount":1,"_maxListeners":null,"members":[]}},"_serializer":{"createReference":{},"timestampsInSnapshots":false},"_referencePath":{"segments":[],"projectId":"project-id","databaseId":"(default)"},"_lastSuccessfulRequest":1547738645649,"_validator":{"isFunction":{},"isOptionalFunction":{},"isInteger":{},"isOptionalInteger":{},"isNumber":{},"isOptionalNumber":{},"isObject":{},"isOptionalObject":{},"isString":{},"isOptionalString":{},"isBoolean":{},"isOptionalBoolean":{},"isArrayElement":{},"isOptionalArrayElement":{},"isDeletePrecondition":{},"isOptionalDeletePrecondition":{},"isDocument":{},"isOptionalDocument":{},"isDocumentReference":{},"isOptionalDocumentReference":{},"isFieldPath":{},"isOptionalFieldPath":{},"isFieldValue":{},"isOptionalFieldValue":{},"isFieldOrder":{},"isOptionalFieldOrder":{},"isQueryComparison":{},"isOptionalQueryComparison":{},"isQueryValue":{},"isOptionalQueryValue":{},"isResourcePath":{},"isOptionalResourcePath":{},"isSetOptions":{},"isOptionalSetOptions":{},"isReadOptions":{},"isOptionalReadOptions":{},"isUpdateMap":{},"isOptionalUpdateMap":{},"isUpdatePrecondition":{},"isOptionalUpdatePrecondition":{}},"_preferTransactions":true},"_path":{"segments":["test"],"projectId":"project-id","databaseId":"(default)"},"_fieldFilters":[],"_fieldOrders":[],"_queryOptions":{},"_validator":{"isFunction":{},"isOptionalFunction":{},"isInteger":{},"isOptionalInteger":{},"isNumber":{},"isOptionalNumber":{},"isObject":{},"isOptionalObject":{},"isString":{},"isOptionalString":{},"isBoolean":{},"isOptionalBoolean":{},"isArrayElement":{},"isOptionalArrayElement":{},"isDeletePrecondition":{},"isOptionalDeletePrecondition":{},"isDocument":{},"isOptionalDocument":{},"isDocumentReference":{},"isOptionalDocumentReference":{},"isFieldPath":{},"isOptionalFieldPath":{},"isFieldValue":{},"isOptionalFieldValue":{},"isFieldOrder":{},"isOptionalFieldOrder":{},"isQueryComparison":{},"isOptionalQueryComparison":{},"isQueryValue":{},"isOptionalQueryValue":{},"isResourcePath":{},"isOptionalResourcePath":{},"isSetOptions":{},"isOptionalSetOptions":{},"isReadOptions":{},"isOptionalReadOptions":{},"isUpdateMap":{},"isOptionalUpdateMap":{},"isUpdatePrecondition":{},"isOptionalUpdatePrecondition":{}},"_serializer":{"createReference":{},"timestampsInSnapshots":false}},"_readTime":{"_seconds":1547738645,"_nanoseconds":638303000},"_size":2,"_materializedDocs":null,"_materializedChanges":null,"_docs":{},"_changes":{},"_validator":{"isFunction":{},"isOptionalFunction":{},"isInteger":{},"isOptionalInteger":{},"isNumber":{},"isOptionalNumber":{},"isObject":{},"isOptionalObject":{},"isString":{},"isOptionalString":{},"isBoolean":{},"isOptionalBoolean":{},"isArrayElement":{},"isOptionalArrayElement":{},"isDeletePrecondition":{},"isOptionalDeletePrecondition":{},"isDocument":{},"isOptionalDocument":{},"isDocumentReference":{},"isOptionalDocumentReference":{},"isFieldPath":{},"isOptionalFieldPath":{},"isFieldValue":{},"isOptionalFieldValue":{},"isFieldOrder":{},"isOptionalFieldOrder":{},"isQueryComparison":{},"isOptionalQueryComparison":{},"isQueryValue":{},"isOptionalQueryValue":{},"isResourcePath":{},"isOptionalResourcePath":{},"isSetOptions":{},"isOptionalSetOptions":{},"isReadOptions":{},"isOptionalReadOptions":{},"isUpdateMap":{},"isOptionalUpdateMap":{},"isUpdatePrecondition":{},"isOptionalUpdatePrecondition":{}}}}

Сначала я подумал, что это может быть проблемой с сериализацией, но если я изменю свою облачную функцию, чтобы она возвращала только один DocumentSnapshot, который возвращает ожидаемые данные.

1 Ответ

0 голосов
/ 17 января 2019

Это проблема с сериализацией. Вы пытаетесь вернуть сложный объект, который не предназначен для прямой сериализации. Вместо этого вам следует перебирать документы в снимке запроса, создавать любой объект, который вы хотите вернуть (массив?), И возвращать его. Примерно так:

const querySnapshot = await db.collection('test').get();
return querySnapshot.docs.map(doc => doc.data());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...