Google Cloud Pub / Sub-Cloud Function和Bigquery-未发生数据插入

时间:2019-03-28 06:04:42

标签: google-bigquery google-cloud-functions google-cloud-pubsub

我正在使用Google Cloud Platform Function,该函数侦听Pub / SubTopic并将数据插入BigQuery中。

我从发布/订阅控制台传递的输入数据为JSON格式{“ NAME”,“ ABCD”},但是从控制台日志中,我可以看到消息以{NAME,ABCD}的形式发送,并且在执行过程中,它也会出错。我遇到的2个常见错误

  1.   

    SyntaxError:JSON中意外的令牌n在exports.helloPubSub的Object.parse(本机)位置1处

  2.   

    “错误:{错误:'rows [0] .json'处的值无效”

给出的输入:

gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}

使用单引号和方括号以及其他可能的选项尝试了多种格式的输入数据,没有任何帮助

尝试使用JSON.parse,JSON.stringfy来解决问题,这有助于避免上述第一个问题,但最终以row[0]问题出现

当我将JSON输入数据作为硬编码值传递到{"NAME", "ABCD"}之类的云函数中时,数据已正确插入。

/**This is working code since i hardcoded the data in JSON format, commented the lines which i tried and did not helped**/

/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event Event payload and metadata.
 * @param {!Function} callback Callback function to signal completion.
 */
exports.helloPubSub = (event, callback) => {
  const pubsubMessage = event.data;
  console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
  const {BigQuery} = require('@google-cloud/bigquery');
  const bigquery = new BigQuery();
  //console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
  //console.log(JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()));
  var myjson='{"NAME":"ABCD","STATE":"HHHH","AGE":"12"}';
  console.log(myjson);
   bigquery
    .dataset("DEMO")
    .table("EMP")
    .insert(JSON.parse(myjson),
    {'ignoreUnknownValues':true, 'raw':false})
  //.insert(JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()), 
    .then ((data) => {
      console.log('Inserted 1 rows');
      console.log(data);
    })
    .catch(err => {
      if (err && err.name === 'PartialFailureError') {
        if (err.errors && err.errors.length > 0) {
          console.log('Insert errors:');
          err.errors.forEach(err => console.error(err));
        }
      } else {
        console.error('ERROR`enter code here`:', err);
      }
    });
  };

1 个答案:

答案 0 :(得分:1)

我使用gcloud进行了快速测试,以发布和提取消息。

使用您提到的语法,我得到以下结果:

gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}
gcloud pubsub subscriptions pull pubsubsubscription1

结果是:

  

数据│{name:ABCD}

如果您改用以下语法:

gcloud pubsub topics publish pubsubtopic1 --message "{\"name\":\"ABCD\"}"
gcloud pubsub subscriptions pull pubsubsubscription1

结果是:

  

数据| {“ name”:“ ABCD”}

编辑2019-04-01

以上解决方法是出于测试目的,需要使用转义字符是使用命令行的警告。要从您的真实应用程序中发布,您可以使用REST调用或here中列出的客户端库。请注意,Pub / Sub API期望消息使用base64编码。例如:

POST https://pubsub.googleapis.com/v1/projects/{YOUR_PROJECT_ID}/topics/{YOUR_TOPIC}:publish?key={YOUR_API_KEY}

{
 "messages": [
  {
   "data": "eyJuYW1lIjoiQUJDRCJ9"
  }
 ]
}