我在外面有一个带有DH22温度/湿度传感器的Raspberry Pi Zero。该传感器通过UDP传递读数,UDP由NodeRed中的UDP输入节点接收。
来自传感器的数据是一个字符串,格式如下:
"(64.4000015258789, 14.899999618530273)"
我对JS没有多少经验,但自从NodeRed开始以来我学到了很多东西。传递给函数的消息被描述为:“消息作为一个名为msg的JavaScript对象传入。按照惯例,它将包含一个包含消息正文的msg.payload属性。” 经过多次尝试和错误后,这是我认为应该工作的代码 - 但它没有......
var str = msg.payload;
var th = str.slice(0, -1);
th = th.split(",");
msg.payload[0] = parseFloat(th[0]);
msg.payload[1] = parseFloat(th[1]);
return [ msg.payload[0], msg.payload[1] ];
然而,我收到此错误:
"TypeError: Cannot assign to read only property '_msgid' of ("
从错误消息中我似乎正在尝试为msg.payload(msg.payload [0])的第一个字符赋值 - 在这种情况下是字符“(”。我有点感到困惑
编辑: 在NodeRed中,我正在使用具有两个输出的功能节点。因此,提到的输入字符串应该被剥离,拆分和解析为浮点数,然后返回到每个输出。要将数据发送到两个不同的输出,请执行以下操作:
return [ data1, data2 ]
Data1到输出1,data2到输出2.
答案 0 :(得分:3)
replace()
和split()
内嵌
var payload = "(64.4000015258789, 14.899999618530273)";
// remove the parentheses and split the remainder into an array
var arr = payload.replace( /[\(\)]/g, "" ).split( /\s*,\s*/ );
console.log( parseFloat( arr[ 0 ] ) );
console.log( parseFloat( arr[ 1 ] ) );
/\s*,\s*/
中的RegExp split()
会将字符串拆分为","
和", "
;它处理逗号之前和/或之后存在任意数量空格的可能性
结果是生成的数组值自动为trimmed。
JS slice
有两个参数:
begin
可选
从零开始的索引开始提取。
可以使用负索引,指示距序列末尾的偏移量。 slice(-2)提取序列中的最后两个元素 如果begin未定义,则切片从索引0开始。
end
可选
基于零的索引,在此之前结束提取。切片提取但不包括结束。
例如,切片(1,4)通过第四个元素(索引为1,2和3的元素)提取第二个元素 可以使用负索引,指示距序列末尾的偏移量。 slice(2,-1)通过序列中倒数第二个元素提取第三个元素 如果省略end,则切片通过序列的末尾(arr.length)提取 如果end大于序列的长度,则切片将在序列的末尾提取(arr.length)。
var foo = "(value, value)";
console.log( foo.slice( 0, -1 ) ); // "(value, value"
console.log( foo.slice( 1, -1 ) ); // "value, value"
我认为下面的代码可能有效。基于有限的考试和零经验,这只是一个最好的猜测。
var arr = msg.payload.slice( 1, -1 ).split( /\s*,\s*/ );
msg.payload = { "value_name_1": arr[ 0 ], "value_name_2: arr[ 1 ] };
// or
msg.payload = arr;
return msg;
在以下2个文档中,修改了return msg;
属性后的代码示例payload
。
这似乎是它的完成方式。
答案 1 :(得分:0)
实际上,slice
和split
的使用存在问题。
以下代码:
var th = str.slice(0, -1);
th = th.split(",");
应更改为:
var th = str.slice(1,-1).split(', ')
如果.slice()
的第一个参数是0
,则结果字符串将以"(",最终引入TypeError
开头。