Google Cloud Functions 节点 JS - 来自客户端获取的 POST 请求,请求正文未通过 [重复]

Posted

技术标签:

【中文标题】Google Cloud Functions 节点 JS - 来自客户端获取的 POST 请求,请求正文未通过 [重复]【英文标题】:Google Cloud Functions node JS - POST request from client-side fetch, request body is not coming through [duplicate] 【发布时间】:2020-11-28 20:17:23 【问题描述】:

我正在尝试使用 javascript fetchapplication/json 作为 content-type 发送 POST 请求,但遇到了问题。当我在邮递员中提出请求时,它工作正常。当我尝试通过 Javascript fetch 执行此操作时,我收到一个错误,并且在 GCF 日志记录方面,当我尝试记录 console.log(req.body) 时,没有注册任何内容。

当我将请求 content-type 更改为 text/plain 然后在我的云函数中解析 JSON 时,我能够成功地显示并注册请求正文,但我想删除它如果可能的话,额外的步骤(并找出为什么这不起作用)。

这是客户端获取请求(基本上是从 Postman 粘贴的),由于某种原因,正文没有通过,我尝试了从属性名称中删除引号并删除 stringify 的各种组合:

    var myHeaders = new Headers();
    myHeaders.append("Content-Type", "application/json");

    var raw = JSON.stringify("key1":"value1","key2":"value2");

    var requestOptions = 
      method: 'post',
      headers: myHeaders,
      body: raw,
      redirect: 'follow'
    ;

    fetch("mycloudfunctionsurl", requestOptions)
      .then(response => response.text())
      .then(result => console.log(result))
      .catch(error => console.log('error', error));

这是我的 Node.JS 运行时 10 云函数代码:

exports.helloHttp = async ( req, res ) => 
    res.set('Access-Control-Allow-Origin', '*');

    console.log(req.body); // <-- Shows up with Postman but not above code, unless I change to text/plain

    var key1 = req.body.key1;
    console.log('key1 is ' + key1);

    // other functions to process the response body
  
;

【问题讨论】:

您是否也在此处尝试满足 CORS 要求? 嗨@DougStevenson,我在客户端遇到的错误是CORS错误,但我之前从http请求收到这些错误作为一般错误,在这种情况下也是POST请求使用不同的内容类型正在工作,所以我认为它与 CORS 无关。这实际上是与内容类型为 JSON 相关的 CORS 问题吗?如果是这样,我该如何解决?为了回答您的问题,请求来自不同的来源。谢谢。 我找到了答案:***.com/questions/38998684/… 【参考方案1】:

这可能是 CORS 问题。发出跨站点请求时,会为您发布的不是请求正文的函数创建一个初始pre-flight request。您在函数中没有看到任何正文的事实很可能是因为它在预期的帖子之前收到了这个飞行前请求。由于响应未授权跨站点请求,因此您的后续 POST 永远不会成功。

我建议看看这个other question 并使用nodejs cors 模块来正确实现它。

【讨论】:

谢谢道格,我会试试这个。但是为什么将帖子正文的内容类型更改为 text/plain 使其无需启用 cors 中间件即可工作?为什么(非 Firebase)云函数中没有记录这一点? cloud.google.com/functions/docs/writing/… 不知道。我在这里根据我对 cors 工作原理的理解进行猜测。 谢谢道格,我想我找到了答案:***.com/questions/38998684/…

以上是关于Google Cloud Functions 节点 JS - 来自客户端获取的 POST 请求,请求正文未通过 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?

具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]

? Google Cloud Functions ?????? MongoDB Atlas ??

Google Cloud Functions 部署问题

如何从 Cloud Functions 连接 Google Cloud SQL?