Javascript Firebase函数:http函数无法读取正文或标题
我的前端有一个简单的函数,它在后端调用firebase函数。尽管请求和API逻辑非常简单,但调用总是失败,因为firebase函数无法检测请求的主体或适当的头 以下是前端代码:Javascript Firebase函数:http函数无法读取正文或标题,javascript,node.js,firebase,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Functions,我的前端有一个简单的函数,它在后端调用firebase函数。尽管请求和API逻辑非常简单,但调用总是失败,因为firebase函数无法检测请求的主体或适当的头 以下是前端代码: 异步函数更新网络( artworkId:字符串, 标题:字符串, 中号:弦,, 描述?:字符串, 价格?:数字, 印刷价格?:数字 ):承诺{ 试一试{ const res=await fetch(`${config.apirl}updateArtwork`{ 方法:“POST”, 正文:JSON.stringify({
异步函数更新网络(
artworkId:字符串,
标题:字符串,
中号:弦,,
描述?:字符串,
价格?:数字,
印刷价格?:数字
):承诺{
试一试{
const res=await fetch(`${config.apirl}updateArtwork`{
方法:“POST”,
正文:JSON.stringify({
artworkId,
标题
描述
价格
印刷价格,
中等的
}),
标题:新标题({'Content Type':'application/json'}),
});
如果(res){
返回res.json();
}否则{
抛出新错误('无法保存对此艺术品的更改');
}
}捕捉(错误){
抛出新错误('无法保存对此艺术品的更改');
}
}
以下是firebase函数:
export const updateArtwork=functions.https.onRequest(
异步(请求、响应)=>{
多切克斯(请求);
常数{
artworkId,
标题
描述
价格
印刷价格,
中等的
}=request.body;
试一试{
等待数据库集合('artworks')。文档(artworkId)。更新({
标题
描述
价格
印刷价格,
中等的
});
返回cors(请求、响应,()=>{
返回响应
.现状(200)
.json(“已成功保存对艺术家的更改”);
});
}捕获(错误){
返回响应状态(500);
}
}
);
函数doChecks()
只是将有关请求的各种信息记录到控制台,包括标题和正文。令人困惑的是,根据这些日志request.body
是{}
,即使在我检查dev tools网络选项卡时,body还是被填充了。类似地,日志告诉我请求上没有内容类型
头,而开发工具告诉我内容类型
是应用程序/json
,这是预期的
此外,前端中的上述调用会进行两个API调用,而不是预期的API调用。我知道这是因为我做了以下几件事:
const res=wait fetch…
行上设置断点if(res).
)doChecks()
函数的更多详细信息。以下是函数:
const-doChecks=(请求:任意)=>{
log('request.body:');
console.log(request.body);
log('request.headers:');
log(request.headers);
log(`content-type是${request.headers['content-type']}`);
};
对于上述通话,以下是记录的内容:
>request.body:
> {}
>request.headers:
> {
>主机:“localhost:5001”,
>连接:“保持活力”,
>接受:“*/*”,
>“访问控制请求方法”:“POST”,
>“访问控制请求头”:“内容类型,pragma”,
>来源:'http://localhost:3001',
>“秒获取模式”:“cors”,
>“sec获取站点”:“同一站点”,
>“sec fetch dest”:“empty”,
>推荐人:'http://localhost:3001/cart',
>“用户代理”:“Mozilla/5.0(Macintosh;英特尔Mac OS X 10_15_4)AppleWebKit/537.36(KHTML,如Gecko)Chrome/83.0.4103.61 Safari/537.36”,
>“接受编码”:“gzip,deflate,br”,
>“接受语言”:“en-US,en;q=0.9”
> }
>内容类型未定义
在把头发撕了很多之后,我找到了解决办法。我只是将firebase函数的所有业务逻辑包装在cors()
调用中,如下所示。我所看到的文档或示例都没有这样做,所以我不知道为什么会这样。如果有人知道,请告诉我
export const updateArtwork=functions.https.onRequest(
异步(请求、响应)=>{
返回cors(请求、响应、异步()=>{
试一试{
常数{
artworkId,
标题
描述
价格
印刷价格,
中等的
}=request.body;
等待数据库集合('artworks')。文档(artworkId)。更新({
标题
描述
价格
印刷价格,
中等的
});
}捕捉(错误){
返回cors(请求、响应,()=>{
响应。状态(500)。结束(错误);
});
}
response.status(200).send('Successfully saved changes to artist');
});
}
);
你能添加一些关于显示空身体的日志吗?@vitooh用log outputHey@gaiudavidius更新了OP!听到你在使用HTTPS firebase函数时遇到这么多麻烦,真是太糟糕了。不确定这在将来是否有帮助,但firebase也有一个可调用函数,可直接从firebase SDK获得。请看这里:。它可能会帮助你们在将来省去很多麻烦,因为它为你们做了大量的标题检查和响应包装:)祝你们好运@blaytenshi很高兴知道,谢谢!我想我会试试看