web-dev-qa-db-fra.com

Test des fonctions de nuage appelables avec le shell Firebase CLI

J'ai essayé de nouvelles fonctions de nuage appelables firebase dans firebase functions:Shell Je continue à avoir l'erreur suivante

La requête a un type de contenu incorrect.

et 

RÉPONSE REÇUE DE LA FONCTION: 400, {"erreur": {"statut": "INVALID_ARGUMENT", "message": "Requête incorrecte"}}

Voici ho W J'essaie d'appeler cette fonction sur Shell

myFunc.post (dataObject)

J'ai aussi essayé ça

myFunc.post (). form (dataObject)

Mais alors je me trompe d’erreur de codage (formulaire). dataObject est un JSON valide.

Mettre à jour:

J'ai pensé que je devais utiliser firebase serve pour l'émulation locale de ces fonctions callable https. Les données doivent être passées dans la requête post comme ceci (notez comment elles sont imbriquées dans le paramètre data)

{
 "data":{
    "applicantId": "XycWNYxqGOhL94ocBl9eWQ6wxHn2",
    "openingId": "-L8kYvb_jza8bPNVENRN"
 }
}

Ce que je ne peux toujours pas comprendre, c'est comment puis-je transmettre des informations d'authentification factices lors de l'appel de cette fonction via un client REST

5
Abhishek Bansal

J'ai réussi à le faire fonctionner à partir des fonctions Shell:

myFunc.post('').json({"message": "Hello!"})

9
MerryOscar

Si vous regardez le code source , vous constaterez qu’il s’agit simplement d’une fonction post https normale. Avec un en-tête d’authentification contenant un jeton Web Json, je vous recommande d’utiliser l’API de l’unité pour https. functions et mocking des méthodes d'en-tête pour renvoyer un jeton d'un utilisateur test ainsi que le corps de la requête

[Mise à jour] Exemple

const firebase = require("firebase");
var config = {
  your config
};
firebase.initializeApp(config);
const test = require("firebase-functions-test")(
  {
    your config
  },
  "your access token"
);
const admin = require("firebase-admin");
const chai = require("chai");
const sinon = require("sinon");

const email = "[email protected]";
const password = "password";
let myFunctions = require("your function file");
firebase
  .auth()
  .signInWithEmailAndPassword(email, password)
  .then(user => user.getIdToken())
  .then(token => {
    const req = {
      body: { data: { your:"data"} },
      method: "POST",
      contentType: "application/json",
      header: name =>
        name === "Authorization"
          ? `Bearer ${token}`
          : name === "Content-Type" ? "application/json" : null,
      headers: { Origin: "" }
    };
    const res = {
      status: status => {
        console.log("Status: ", status);
        return {
          send: result => {
            console.log("result", result);
          }
        };
      },
      getHeader: () => {},
      setHeader: () => {}
    };
    myFunctions.yourFunction(req, res);
  })
  .catch(console.error);
1
raycar5

Autant que je sache, le paramètre second de la fonction contient toutes les données supplémentaires. Passez un objet contenant une carte headers et vous devriez pouvoir spécifier tout ce que vous voulez.

myFunc.post("", { headers: { "authorization": "Bearer ..." } });

Si vous utilisez Express pour gérer le routage, il se présente simplement comme suit:

myApp.post("/my-endpoint", { headers: { "authorization": "Bearer ..." } });
0
Douglas Manley