我一直在尝试新的 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 客户端调用该函数时传递虚拟身份验证信息
我设法让它在函数 shell 中运行:
myFunc.post('').json({"message": "Hello!"})
据我所知,函数的 second 参数包含所有附加数据。 传递一个包含
headers
地图的对象,您应该能够指定您想要的任何内容。
myFunc.post("", { headers: { "authorization": "Bearer ..." } });
如果您使用 Express 来处理路由,那么它看起来就像:
myApp.post("/my-endpoint", { headers: { "authorization": "Bearer ..." } });
CLI 的正确语法已更改为
myFunc({"message": "Hello!"})
如果您查看源代码,您可以看到它只是一个普通的 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);
我尝试了 json 版本,看起来它不再是一个函数了。
myHttpsFunc.post(...).json is not a function
在 firebase shell 上,由于 json 不是函数,因此我们应该使用第二个参数来传递所需的内容。您可以传递 headers、body 以及可能的其他请求字段。
我能够使用第二个参数通过有效负载调用
firebase functions:shell
中的 firebase 函数。
myfunc.post('', {
body: {
key: "value",
key2: "value"
}
});
我真的认为 firebase 团队应该更新他们的文档,因为我找不到使用 json 参数调用它的方法。
Firebase 文档:https://firebase.google.com/docs/functions/local-shell