Raspberry pi 测试云函数-无法读取属性';数据';未定义的

Raspberry pi 测试云函数-无法读取属性';数据';未定义的,raspberry-pi,google-cloud-functions,iot,Raspberry Pi,Google Cloud Functions,Iot,我有一个树莓皮和设置一个天气(和土壤湿度)钻机 我找到了这本指南:我遵循了它,在第6-7步的时候被卡住了 据我所知,当我向PubSub发送数据时,什么都没有发生。在Raspberry端,我有点认为数据正在发送,但没有传递到BigQuery。我在不同的地方做了一些打印声明,试图看看它在哪里卡住了 当我试图找到错误时,我慢慢地返回到步骤5(创建一个云函数)。 步骤5以及我复制的相关代码可以在这里看到: 在GCP中-我点击进入云功能->功能测试->测试(选项卡) 在-Trigger event-标题下

我有一个树莓皮和设置一个天气(和土壤湿度)钻机

我找到了这本指南:我遵循了它,在第6-7步的时候被卡住了

据我所知,当我向PubSub发送数据时,什么都没有发生。在Raspberry端,我有点认为数据正在发送,但没有传递到BigQuery。我在不同的地方做了一些打印声明,试图看看它在哪里卡住了

当我试图找到错误时,我慢慢地返回到步骤5(创建一个云函数)。 步骤5以及我复制的相关代码可以在这里看到:

在GCP中-我点击进入云功能->功能测试->测试(选项卡)

在-Trigger event-标题下,我填写了以下JSON:

{
 "sensorID":"Raspberry", 
 "timecollected":"2020-09-11 06:45:19", 
 "zipcode":"00000", 
 "latitude":"0.0", 
 "longitude":"0.0", 
 "temperature":"-273", 
 "humidity":"-1", 
 "dewpoint":"-273", 
 "pressure":"0"
}
当我点击-测试功能-输出如下

**Error: function execution failed. Details:
Cannot read property 'data' of undefined**

我猜是这两件事中的一件造成了这个问题。 事件.数据发布子消息.数据

我试图对代码做一些修改,但我只是在瞎猜

我想知道:

  • 我做错了什么,这意味着可能还有其他原因 其他地方的问题
  • 这本指南有点旧了,而且有 有一些更新使得指南中的旧代码不可用 按需运行。(指南中的步骤/图像与什么不匹配 我在网上看到,截至2020年9月)
  • 如果有人知道什么是错误的 代码,并能让我知道如何解决它,这将是 非常感谢
  • 提前感谢。

    TLDR:教程已经过时,不要使用它,除非你想面对多个问题并想通过艰苦的方式学习

    我阅读了教程,并且能够复制这个问题。。还有更多。正如您已经提到的,本教程已经过时,并且许多内容已经发生了变化,您可以通过查看图像并注意到UI甚至有所不同来推断,因此我不会向GCP新手推荐本教程

    第一个问题:

    **Error: function execution failed. Details: Cannot read property 'data' of undefined**
    
    通过查看pub/sub消息的预期内容,可以轻松解决此问题:

    {
      "data": string,
      "attributes": {
        string: string,
        ...
      },
      "messageId": string,
      "publishTime": string,
      "orderingKey": string
    }
    
    这么简单吧?但是,一旦您像我一样使用自己的变量模拟消息的结构:

    {
    “数据”:“,
    “属性”:{
    “sensorID”:“覆盆子”,
    “收集的时间”:“2020-09-11 06:45:19”,
    “zipcode”:“00000”,
    “纬度”:“0.0”,
    “经度”:“0.0”,
    “温度”:“-273”,
    “湿度”:“-1”,
    “露点”:“-273”,
    “压力”:“0”
    },
    “消息id”:“id_1”,
    《出版时间》:“2014-10-02T15:01:23Z”,
    “orderingKey”:”
    }
    
    您将得到一个关于JSON的错误:

    SyntaxError: Unexpected token ' in JSON at position 1
    
    此错误是由于在变量
    incomingData
    内部构造JSON时使用了
    ,因此您必须更改第一个变量声明,我使用了模板文本:

    const incomingData = PubSubMessage.data ? Buffer.from(PubSubMessage.data, 'base64').toString() : `{"sensorID": "na","timecollected":"01/01/1970 00:00:00","zipcode":"00000","latitude":"0.0","longitude":"0.0","temperature":"-273","humidity":"-1","dewpoint":"-273","pressure":"0"}`;
    
    但问题还没有结束,在尝试插入BigQuery时做了一些测试之后,我得到了一个关于插入的错误,但没有得到真正发生了什么的线索,所以我在一个外部脚本中隔离了consult,发现错误处理是错误的,我建议您首先更改
    package.json
    中的
    BigQuery
    版本:

    "@google-cloud/bigquery": "^0.9.6"
    
    进入

    这是撰写此答案时的最后一个版本。下一部分是将使用
    BigQuery
    构造函数的方式重新定义为:

    const bigquery=new bigquery({
    projectd:projectd
    });
    
    经过多次测试后,我发现
    catch
    没有按预期完成工作,因此必须将该部分重写为:

    bigquery
    .dataset(datasetId)
    .table(tableId)
    .插入(行)
    .然后((foundErrors)=>{
    rows.forEach((row)=>console.log('Inserted:',row));
    if(foundErrors&&foundErrors.insertErrors!=未定义){
    foundErrors.forEach((err)=>{
    log('Error:',err);
    })
    }
    })
    .catch((错误)=>{
    大查询
    .dataset(datasetId)
    .table(tableId)
    .插入(行)
    .然后((foundErrors)=>{
    rows.forEach((row)=>console.log('Inserted:',row));
    if(foundErrors&&foundErrors.insertErrors!=未定义){
    foundErrors.forEach((err)=>{
    log('Error:',err);
    })
    }
    })
    .catch((错误)=>{
    如果(err.name='PartialFailureError'){
    if(err&&err.response.insertErrors!=未定义){
    err.response.insertErrors.forEach((错误)=>{
    console.log(错误);
    })
    }
    }否则{
    log(“一般错误:”,err)
    }
    });
    });
    
    在此之后,您将最终注意到错误是由
    incomingData
    变量引起的:

    Could not parse \'01/01/1970 00:00:00\' as a timestamp. Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]'
    
    您必须将日期从
    01/01/1970 00:00:00
    更改为
    1970-01-01 00:00

    还和我在一起吗?还有一个错误来自CF末尾使用
    callback

    这是因为云函数现在需要三个,回调是最后一个,所以将函数声明更改为:

    exports.subscribe = function (event, context, callback)
    
    在所有这些之后,您已经能够将数据插入到BigQuery中,但是我们使用的是局部变量,而不是来自pub/sub的数据,在这一点上我放弃了,因为我需要实际重写整个函数,以便通过使用而不是
    数据
    使其工作


    因此,如前所述,如果你开始在GCP领域学习,请不要遵循本教程。

    我将不得不慢慢消化这一点。。。我将仔细阅读你的笔记,以了解你的思路,即使教程不起作用,你的写作内容也很广泛。。。令人惊奇的是。。。我不可能弄明白。非常感谢你。。。为了拿t
    exports.subscribe = function (event, context, callback)