Ошибка, когда я вызываю облачную функцию после флаттера - PullRequest
1 голос
/ 17 апреля 2019

Я создал облачные функции, чтобы они работали (я проверял их с почтальоном).Когда я пытаюсь вызвать их с помощью Flutter, у меня появляется ошибка:

I/flutter (14755): throwing firebase functions exception
I/flutter (14755): caught firebase functions exception
I/flutter (14755): INTERNAL
I/flutter (14755): Response is missing data field.
I/flutter (14755): null
I/flutter (14755): null

Я добавил

firebase_core: ^0.3.1+1
cloud_functions: ^0.1.2+1

в моем pubspec.yaml

В одном измои файлы дротиков:

import 'package:youpa/Services/users.services.dart';

[...]

TextField(
          autofocus: true,
          decoration: const InputDecoration(
            hintText: 'Rechercher une personne',
            border: InputBorder.none,
          ),
          onChanged: (string) async {
            UsersService().searchInAllUsers(string).then((user){
              print(user);
            });
          },
        ),

Здесь мой users.services.dart:

import 'package:cloud_functions/cloud_functions.dart';
import 'package:youpa/Model/user.model.dart';
import 'dart:async';

class UsersService {
  Future<User> searchInAllUsers(String search) async {
    try {
      final dynamic resp = await CloudFunctions.instance.call(
        functionName: 'getUsersBase',
        parameters: <String, dynamic>{
          'txt': search,
          'max': 20,
        },
      );
      print("G : " + resp);
      return resp;
    } on CloudFunctionsException catch (e) {
      print('caught firebase functions exception');
      print(e.code);
      print(e.message);
      print(e.details);
    } catch (e) {
      print('caught generic exception');
      print(e);
    }
  }
}

А вот, мое облакоФункция:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
let users = [];
let number = 1;

function compareStrings(comparing, compared) {
    var points = 0;
    var test = compared.toUpperCase().indexOf(comparing.toUpperCase());
    // console.log("Compared : " + compared + " To Upper Case : " + compared.toUpperCase());
    // console.log("Comparing : " + comparing + " To Upper Case : " + comparing.toUpperCase());
    // console.log(test);
    if (test >= 0) {
        points += 1;
        if (test === 0) {
            points += 2;
        }
        var test2 = compared.indexOf(comparing);
        if (test2 >= 0) {
            points += 1;
            if (test === 0) {
                points += 1;
            }
        }
        if (compared.toUpperCase() === comparing.toUpperCase()) {
            points += 5;
        }
        if (compared === comparing) {
            points += 10;
        }
    }
    return points;
}

function compareUser(firstName, lastName, pseudo, comparing) {
    var points = 0;
    points += compareStrings(comparing, firstName);
    points += compareStrings(comparing, lastName);
    points += (compareStrings(comparing, pseudo) * 4);
    points += (compareStrings(comparing, firstName + " " + lastName) * 2);
    return points;

}

function searchInUsers(array, comparing, max) {
    console.log(max);
    let list = [];
    let finalList = [];
    array.forEach((user) => {
        const points = compareUser(user[1], user[2], user[3], comparing);
        const id = user[0];
        // console.log(id + " - " + user[1] + " => " + points);
        // console.log(list[points]);
        if (list[points] === undefined) {
            list[points] = [];
        }
        list[points].push(id);
    });
    list.forEach((item, index) => {
        if (index !== 0) {
            item.forEach((item) => {
                finalList.push(item);
            });
        }
    });
    finalList = finalList.reverse();
    if(max !== undefined){
        console.log("Slicing");
        finalList = finalList.slice(0, max);
    }
    return finalList;
}

exports.getUsersBase = functions.https.onRequest((request, response) => {
    if (users.length === 0) {
        console.log("user = null");
        db.collection('users').get()
            .then((snapshot) => {
                snapshot.forEach((doc) => {
                    const data = [];
                    data.push(doc.id);
                    data.push(doc.data().firstName);
                    data.push(doc.data().lastName);
                    data.push(doc.data().pseudo);
                    console.log(doc.id, '=>', doc.data());
                    users.push(data);
                });
                response.send(searchInUsers(users, request.query.txt, request.query.max));
            })
            .catch((err) => {
                console.error('Error getting documents', err);
                response.send(err);
            });
    } else {
        console.log("user != null");
        response.send(searchInUsers(users, request.query.txt, request.query.max));
    }
});

Когда я пишу или удаляю письмо в моем TextField, у меня в консоли есть это:

I/flutter (14755): throwing firebase functions exception
I/flutter (14755): caught firebase functions exception
I/flutter (14755): INTERNAL
I/flutter (14755): Response is missing data field.
I/flutter (14755): null
I/flutter (14755): null

Заранее благодарен.Жереми.

1 Ответ

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

Попробуйте использовать:

 flutter clean
 cd ios
 pod install

И попробуйте еще раз

UPDATE

Убедитесь, что вы правильно отправляете параметры:

    parameters: {
        "data": {
          'txt': search,
          'max': 20,
          },
      },

ОБНОВЛЕНИЕ 2

Измените вашу функцию и получите параметры следующим образом:

const { body } = request;
const txt = request.query.txt || body.txt || (body.data && body.data.txt);
const max = request.query.max || body.max || (body.data && body.data.max);

ОБНОВЛЕНИЕ 3

Я думаю, вам нужно вернуть что-то вроде этого:

  response.status(200).json({ data: {"your_data_here" }, message: "any_message_if_you_want" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...