【问题标题】:google cloud function is not able to capture the post request谷歌云功能无法捕获发布请求
【发布时间】:2019-08-03 18:16:22
【问题描述】:

我的目标是使用谷歌云功能将发布请求的结果插入到 bigquery 中。

我的问题是云函数正在向我的表中插入空值,因此它无法从发布请求中取回参数。

这是我的发帖请求:

<script>
var event_category = 'action';
var event_name = 'click';
var page_url = 'test'
var request = new XMLHttpRequest();
request.open('POST', 'url to my cloud function');
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        params = {
              event_category: event_category, 
              event_name: event_name, 
              page_url: page_url
              } 
request.send( JSON.stringify(params));
console.log(JSON.stringify(params));
</script>

谷歌云功能代码

const bigquery = require('@google-cloud/bigquery')();
var result = "";

function insertHandler(err, apiResponse) {
  result.writeHead("204",
   "No Content",
   {
     "access-control-allow-origin": "urlofmywebsite",
     "access-control-allow-methods": "GET, POST, OPTIONS",
     "access-control-allow-headers": "content-type, accept",
     "access-control-max-age": 10, // Seconds.
     "content-length": 0
   }
);
return(result.end());
}


exports.loadBQ = function loadBQ (req, res) {
  result = res;
  var dataset = bigquery.dataset("google_analytics_test"); 
  var table = dataset.table("google_tag_manager"); 
  var event_category;
  var event_name;
  var page_url;

  try{
      event_category = req.body.event_category;
      event_name = req.body.event_name;
      page_url = req.body.page_url;
    var row = {
      json: {
        event_category : event_category,
        event_name: event_name,
        page_url: page_url
      }
    };
    var options = {
      raw: true
    };
    table.insert(row, options, insertHandler);
  } catch(e){insertHandler(true, false)};
};

如前所述,问题在于从谷歌云功能读取帖子请求,不知道如何解除阻止

【问题讨论】:

    标签: javascript post google-cloud-platform google-cloud-functions


    【解决方案1】:

    而不是req.body 使用req.query 然后像这样通过URL 传递变量,用于HTTP 事件触发Google Cloud Function https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME?event_category=CATEGORY&amp;event_name=EVENT&amp;page_url=URL

    当我尝试使用您的代码进行复制时,没有分配变量,因此最后它们是 undefined,但是在将 req.body 修改为 req.query 之后,我能够获得正确的值。

    以下是 Google Cloud Function 的示例代码:

    var event_category;
    var event_name;
    var page_url;
    
    event_category = req.query.event_category;
    event_name = req.query.event_name;
    page_url = req.query.page_url;
    
    console.log("===VALUES===");
    console.log(event_category);
    console.log(event_name);
    console.log(page_url);
    

    之后,您应该会在 Google Stackdrive 日志记录页面中看到记录的值。

    【讨论】:

      【解决方案2】:

      有一种方法可以处理实际的 POST,而不必求助于来自 https://cloud.google.com/functions/docs/writing/http#writing_http_helloworld-nodejs 的 GET...

      const escapeHtml = require('escape-html');
      
      /**
       * Responds to an HTTP request using data from the request body parsed according
       * to the "content-type" header.
       *
       * @param {Object} req Cloud Function request context.
       * @param {Object} res Cloud Function response context.
       */
      exports.helloContent = (req, res) => {
        let name;
      
        switch (req.get('content-type')) {
          // '{"name":"John"}'
          case 'application/json':
            name = req.body.name;
            break;
      
          // 'John', stored in a Buffer
          case 'application/octet-stream':
            name = req.body.toString(); // Convert buffer to a string
            break;
      
          // 'John'
          case 'text/plain':
            name = req.body;
            break;
      
          // 'name=John' in the body of a POST request (not the URL)
          case 'application/x-www-form-urlencoded':
            name = req.body.name;
            break;
        }
      
        res.status(200).send(`Hello ${escapeHtml(name || 'World')}!`);
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-05
        • 1970-01-01
        • 2017-08-15
        • 2021-02-26
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多