因为颤动我调用云功能时出错

问题描述 投票:1回答:1

我已经创建了他们工作的云功能(我用邮差测试了它们)。当我尝试用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

在我的一个dart文件中:

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

提前致谢。杰里米。

dart flutter google-cloud-functions
1个回答
0
投票

尝试使用:

 flutter clean
 cd ios
 pod install

然后再试一次

UPDATE

验证您是否正确发送参数:

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

更新2

修改你的函数并使用这种方式得到params:

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" });
© www.soinside.com 2019 - 2024. All rights reserved.