Javascript Firebase函数:http函数无法读取正文或标题

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({

我的前端有一个简单的函数,它在后端调用firebase函数。尽管请求和API逻辑非常简单,但调用总是失败,因为firebase函数无法检测请求的主体或适当的头

以下是前端代码:

异步函数更新网络(
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).
  • 检查“网络”选项卡并看到对同一端点的两个POST调用
  • 更奇怪的是,上面的代码最近都没有更改。最近的环境变化(升级npm包等)可能以某种方式把事情搞砸了,但不清楚它们会产生什么影响

    在此方面的任何帮助都将不胜感激

    编辑 下面是关于上面提到的
    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很高兴知道,谢谢!我想我会试试看