Google bigquery 谷歌云发布/分云功能&;Bigquery-数据插入未发生

Google bigquery 谷歌云发布/分云功能&;Bigquery-数据插入未发生,google-bigquery,google-cloud-functions,google-cloud-pubsub,Google Bigquery,Google Cloud Functions,Google Cloud Pubsub,我使用的是谷歌云平台函数,它监听发布/分类主题,并在BigQuery中插入数据 我从发布/订阅控制台传递的输入数据是JSON格式{“NAME”,“ABCD”},但是从控制台日志中,我可以看到消息是以{NAME,ABCD}的形式出现的,在执行过程中,它也会出错。我面临的两个常见错误 SyntaxError:exports.helloPubSub中Object.parse(本机)位置1处JSON中意外的标记n“ 错误:{ERROR:rows[0].json'处的值无效 提供的输入: gclo

我使用的是谷歌云平台函数,它监听发布/分类主题,并在BigQuery中插入数据

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

  • SyntaxError:exports.helloPubSub中Object.parse(本机)位置1处JSON中意外的标记n“

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

  • 提供的输入:

    gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}
    
    尝试了使用单引号、方括号和其他可能的选项的各种输入数据格式,但没有任何帮助

    解决方法类似于使用JSON.parse、JSON.stringfy,这有助于避免上述第一个问题,但最终导致
    行[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);
          }
        });
      };
    

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

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

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

    资料│ {名称:ABCD}

    如果改用此语法:

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

    数据{“名称”:“ABCD”}

    编辑2019-04-01 上述解决方法用于测试目的,需要使用转义字符是使用命令行的一个警告。要从实际应用程序发布,可以使用REST调用或所列的客户端库。请注意,发布/订阅API要求消息采用base64编码。例如:

    POST https://pubsub.googleapis.com/v1/projects/{YOUR_PROJECT_ID}/topics/{YOUR_TOPIC}:publish?key={YOUR_API_KEY}
    
    {
     "messages": [
      {
       "data": "eyJuYW1lIjoiQUJDRCJ9"
      }
     ]
    }
    

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

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

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

    资料│ {名称:ABCD}

    如果改用此语法:

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

    数据{“名称”:“ABCD”}

    编辑2019-04-01 上述解决方法用于测试目的,需要使用转义字符是使用命令行的一个警告。要从实际应用程序发布,可以使用REST调用或所列的客户端库。请注意,发布/订阅API要求消息采用base64编码。例如:

    POST https://pubsub.googleapis.com/v1/projects/{YOUR_PROJECT_ID}/topics/{YOUR_TOPIC}:publish?key={YOUR_API_KEY}
    
    {
     "messages": [
      {
       "data": "eyJuYW1lIjoiQUJDRCJ9"
      }
     ]
    }
    

    非常感谢mike,您上面提到的方法非常有效,但我的源数据将始终使用正确的JSON格式,而没有附加此“\”符号。请您帮助理解为什么我们的JSON语法不起作用!根据您的建议,我认为唯一可行的方法是,我们需要找到一种方法来包括”\“每次处理源JSON数据集时都会出现。请建议您是否找到更好的解决方案嗨,我用最新的评论更新了解决方案。谢谢Mike。您的第一个解决方案对我帮助很大。我在云函数中做了更改,将{JSON}转换为{“JSON”}”使用java脚本替换方法格式化。消息正在被正确地拾取和插入。现在使用不同的数据集进行测试。如果还有任何问题,我将在这里更新。再次感谢Hanks,mike,您提到的方法非常有效,但我的源数据将始终使用正确的JSON格式,而JSON格式没有这是附加的“\”。请您帮助理解为什么我们的JSON语法不起作用!根据您的建议,我认为唯一可行的方法是,我们需要找到一种包含“\”的方法每次处理源JSON数据集时都会出现。请建议您是否找到更好的解决方案。嗨,我用最新的评论更新了解决方案。谢谢Mike。您的第一个解决方案对我帮助很大。我在云函数中做了更改,将{JSON}转换为{“JSON”}使用java脚本替换方法格式化。正在正确地拾取和插入消息。正在使用不同的数据集进行测试。如果还有任何问题,我将在此处更新。再次感谢