6
votes

Fonctions Google Cloud: renvoyer un JSON valide

J'essaie d'appeler une fonction Google Cloud depuis mon application Flutter à l'aide du package cloud_functions.

Voici ma fonction Cloud:

try {
  final dynamic resp =
      await CloudFunctions.instance.call(
    functionName: "helloWorld"
  );
  print(resp);

} on CloudFunctionsException catch (e) {
  ...
} catch (e) {
  ...
} finally {
  ...
}

Et voici ma méthode flutter qui appelle cette fonction:

export const helloWorld = functions.region('europe-west1').https.onRequest((request, response) => {
response.status(200).json({
    message: "Hello World!"
  });
});

Comme vous pouvez le voir, c'est la forme la plus simple d'une requête sans aucun paramètre.

Mon problème: Chaque appel à la fonction Cloud entraîne une exception CloudFunctionsException. Raison: " La réponse n'est pas un objet JSON valide. ".

Peut-être que quelqu'un a une idée de ce qui ne va pas ici? Si j'appelle la fonction cloud via Postman ou un navigateur, un objet JSON valide est renvoyé et aucune exception n'est levée.

Merci d'avance, Michael


0 commentaires

3 Réponses :


5
votes

Si vous souhaitez utiliser le SDK Flutter pour appeler une fonction appelable, vous devez en fait définir une fonction appelable. En ce moment, vous déclarez une fonction HTTP, ce qui n'est pas la même chose. Veuillez lire la documentation des fonctions appelables pour savoir comment déclarer et implémenter un appelable.

Au lieu de ceci:

functions.https.onCall(...)

Cela ressemblera à ceci:

functions.https.onRequest(...)

Ensuite, vous retournez un objet JavaScript à convertir en JSON, plutôt que d'utiliser un objet de réponse.


1 commentaires

C'est exactement ce que j'ai fait en premier selon la documentation du module - avec la même exception lancée: export const helloWorld = functions.https.onCall ((data, context) => {return {message: "Hello World"}});



4
votes

J'ai pu trouver le bogue: Dès que vous définissez une autre région que celle par défaut, le package flutter cloud_functions semble ne plus pouvoir trouver la fonction:

Fonctionne:

export const helloWorld = functions.region('europe-west1').https.onCall((data, context) => {
    return {
        message: "Hello World"
    }
});


5 commentaires

Si vous modifiez la région de la fonction dans sa définition, vous modifiez également son URL. Le SDK client de fonctions ne sait pas que vous avez fait cela, vous devez donc lui indiquer la région afin qu'il puisse créer l'URL correctement. Sous Android, vous modifiez la région avec getInstance (région) . Je ne sais pas comment cela fonctionne sur Flutter, probablement similaire.


Semble que cela n'est pas pris en charge par le package pour le moment - je le suggérerai sur GitHub. Merci pour vos contributions!


ayant le même problème ici, avez-vous eu des mises à jour sur ce @Michael?


Merci @Michael! J'ai sauvé ma soirée!


Semble être corrigé github.com/FirebaseExtended/flutterfire/issues/577



1
votes

J'avais le même problème, et ce qui a fonctionné pour moi était:

(Ajout à la réponse de @Michael)

Lors de la déclaration et de l'appel la fonction cloud, il est important de spécifier la région dans les deux cas.

Mon erreur a été de définir uniquement le code de région sur la déclaration de la fonction.

Plus d'informations ici : https://firebase.google.com/docs/functions/locations#client -side_location_selection_for_callable_functions .

Pour Flutter, vous devez spécifier la région dans le paramètre region du singleton CloudFunctions

CloudFunctions(app: FirebaseApp.instance, region: "europe-west1")


0 commentaires