Почему моя облачная функция неправильно возвращает мою карту? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующая функция: я пытаюсь вернуть массив карт в свое приложение flutter

export const usersFromContacts = functions.region('europe-west1').https.onCall(async (data, context) => {
    Authentication.authenticate(context);
    const phonenumbers = Validator.validateArray<string>('phonenumbers', data['phonenumbers']);

    const privateDataPromises = [];
    for (let i = 0; i < phonenumbers.length; i++)
        privateDataPromises.push(...(await firestore.collectionGroup('userPrivateData')
            .where('phonenumber', '==', phonenumbers[i]).get()).docs);
    const userSnapshots = await Promise.all(privateDataPromises);

    const userPromises = [];
    for (let i = 0; i < userSnapshots.length; i++) {
        const userID = privateDataPromises[i].id;
        userPromises.push(userCollection.doc(userID).get());
    }

    const returnValue = (await Promise.all(userPromises)).map((document) => UserModel.fromFirestoreDocumentData(document).toMap());
    console.log(returnValue);
    return returnValue;
});

Если я зарегистрирую тестовое поле в консоли облачных функций, я получаю правильный массив карт с правильными данными на картах.

[ Map {
    'id' => 'ID',
    'displayName' => 'Name',
    'phoneNumber' => 'Phonenumber',
    'photoUrl' => 'PhotoUrl' } ]

Это то, что я получаю обратно в консоли функций firebase. Где я заменил значения c.

Затем внутри флаттера я делаю

  Future<HttpsCallableResult> _callCloudFunction(String functionName, {Map<String, dynamic> data}) async {
    final cloudFunction = api.getHttpsCallable(functionName: functionName);
    try {
      final httpCallable = await cloudFunction.call(data).timeout(Duration(seconds: timeout));
      print(httpCallable.data); // this prints [{}] an empty array of maps?
      return httpCallable;
    } on CloudFunctionsException catch (error) {
      throw new UserFriendlyException(error.code, error.message);
    } on TimeoutException catch (error) {
      throw new UserFriendlyException('Operation Failed', error.message);
    } catch (error) {
      throw new UserFriendlyException('Operation Failed', 'There was a problem with with executing the operation');
    }
  }

И получаю пустой массив карт? Что я делаю не так?

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

1 Ответ

1 голос
/ 07 мая 2020

Вы пытаетесь сериализовать объект карты ES6 от функции к клиенту. Это не будет работать так, как вы хотите.

Вызываемая функция Cloud Functions поддерживает только сериализацию простых JavaScript объектов, массивов и примитивных значений. Вместо передачи Map передайте обычный объект JS. Это код, который вам нужно будет изменить:

UserModel.fromFirestoreDocumentData(document).toMap()

Вам нужно будет войти внутрь этой toMap функции и изменить ее или преобразовать ее вывод в обычные JS объекты для сериализации.

...