Google Cloud Functions节点JS-客户端获取POST请求,请求主体未通过

时间:2020-08-08 19:52:52

标签: javascript json post google-cloud-functions fetch

我正在尝试使用Javascript fetch发送POST请求,并将application/json作为content-type,但是遇到了问题。当我在Postman中执行请求时,它可以正常工作。当我尝试通过Javascript提取进行操作时,出现错误,并且在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 Cloud Function代码:

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
  
};

1 个答案:

答案 0 :(得分:0)

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

我建议查看此other question并使用nodejs cors模块正确实现它。