web-dev-qa-db-ja.com

Firebase CLIシェルで呼び出し可能なクラウド関数をテストする

firebase functions:Shellで新しいFirebase呼び出し可能クラウド関数を試しましたが、次のエラーが発生し続けます

リクエストのコンテンツタイプが正しくありません。

そして

関数から受け取った応答:400、{"error":{"status": "INVALID_ARGUMENT"、 "message": "Bad Request"}}

これは私がシェルでこの関数を呼び出そうとしている方法です

myFunc.post(dataObject)

私もこれを試しました

myFunc.post()。form(dataObject)

しかし、その後、間違ったエンコーディング(フォーム)エラーが発生します。 dataObjectは有効なJSONです。

更新:

これらのfirebase serve関数のローカルエミュレーションにはcallable httpsを使用する必要があると考えました。このようにデータをpostリクエストで渡す必要があります(dataパラメータでどのようにネストされているかに注意してください)

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

それでもわからないのは、REST clientを介してその関数を呼び出すときに、ダミーの認証情報を渡す方法です。

11
Abhishek Bansal

私はそれを機能シェル内からこれを実行してうまく動かすことができました:

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

14
MerryOscar

私の知る限り、関数のsecondパラメータには、追加のデータがすべて含まれています。 headersマップを含むオブジェクトを渡すと、必要なものをすべて指定できるはずです。

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

Expressを使用してルーティングを処理している場合は、次のようになります。

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

ソースコード を見ると、それが単なる通常のhttpsポスト関数であることがわかります。jsonWebトークンを含む認証ヘッダーを使用する場合、 https関数のユニットテストAPI とヘッダーメソッドをモックして、テストユーザーとリクエスト本文からトークンを返す

[更新]

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);
2
raycar5