使用 Firebase CLI shell 测试可调用云函数

问题描述 投票:0回答:5

我一直在尝试新的 firebase 可调用云函数

firebase functions:shell
我不断收到以下错误

请求的内容类型不正确。

从函数收到的响应:400,{“error”:{“status”:“INVALID_ARGUMENT”,“message”:“错误请求”}}

这里是嗬 w 我试图在 shell 上调用这个函数

myFunc.post(dataObject)

我也试过这个

myFunc.post().form(dataObject)

但是后来我得到了错误的编码(形式)错误。

dataObject
是有效的 JSON。

更新:

我认为我需要使用

firebase serve
来本地模拟这些
callable https
函数。数据需要像这样在 post 请求中传递(注意它是如何嵌套在
data
参数中的)

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

我仍然无法弄清楚如何在通过 REST 客户端调用该函数时传递虚拟身份验证信息

node.js firebase google-cloud-functions firebase-cli
5个回答
21
投票

我设法让它在函数 shell 中运行:

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


4
投票

据我所知,函数的 second 参数包含所有附加数据。 传递一个包含

headers
地图的对象,您应该能够指定您想要的任何内容。

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

如果您使用 Express 来处理路由,那么它看起来就像:

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

3
投票

CLI 的正确语法已更改为

myFunc({"message": "Hello!"})


2
投票

如果您查看源代码,您可以看到它只是一个普通的 https post 函数,具有包含 json Web 令牌的身份验证标头,我建议使用 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);

0
投票

我尝试了 json 版本,看起来它不再是一个函数了。

myHttpsFunc.post(...).json is not a function

在 firebase shell 上,由于 json 不是函数,因此我们应该使用第二个参数来传递所需的内容。您可以传递 headersbody 以及可能的其他请求字段。

我能够使用第二个参数通过有效负载调用

firebase functions:shell
中的 firebase 函数。

myfunc.post('', {
  body: {
    key: "value",
    key2: "value"
  }
});

我真的认为 firebase 团队应该更新他们的文档,因为我找不到使用 json 参数调用它的方法。

Firebase 文档:https://firebase.google.com/docs/functions/local-shell

© www.soinside.com 2019 - 2024. All rights reserved.