NodeJS 如何在红节点中增加消息有效负载[i]

yqlxgs2m  于 2023-01-04  发布在  Node.js
关注(0)|答案(1)|浏览(120)

我们正在一个ubuntu服务器上工作,我们已经安装了node-red,我们想要从MySQL数据库的一个表中提取数据,然后将其移动到另一个表中。
我们的流程如下所示:

我们的“选择公差”节点包含:

msg.topic = "SELECT * FROM Tolerance";
return msg;

简单的代码,从我们的数据库中选择数据。如果我们像这样连接一个调试节点:

然后,我们会看到如下所示的输出:

我们希望选取所有数据,因此需要遍历数组中的所有对象,确保获取所有值并将其发送到新的数据库表。我们使用'New Tolerance'节点来执行此操作,'New Tolerance'包含:

var i;
var secured = 1;

for (i = 0; i < msg.payload.length; i++) {
    var time_start = msg.payload[i].time_start
    var time_end = msg.payload[i].time_end
    var temperatur_lpn = msg.payload[i].temperatur_lpn
    var temperatur_rising = msg.payload[i].temperatur_rising
    var temperatur_weather = msg.payload[i].temperatur_weather
    var temp_compare_WL = msg.payload[i].temp_compare_WL
    var temp_compare_WR = msg.payload[i].temp_compare_WR

var out = "INSERT INTO Sunrise_Tolerance (time_start, time_end, temperatur_lpn, temperatur_rising, temperatur_weather, temp_compare_WL, temp_compare_WR, secured)"

out = out + " VALUES ('" + time_start + "','" + time_end + "','" + temperatur_lpn + "','" + temperatur_rising + "','" + temperatur_weather + "','" + temp_compare_WL + "','" + temp_compare_WR + "','" + secured + "');"

msg.topic = out;
return msg;
}

问题是我们只接收第一行数据(数组中的第一个对象),而不是其余的。有人能解释为什么我们只接收第一行,而不是所有的数据吗?

sgtfey8w

sgtfey8w1#

问题在于for循环中有一个return语句。
这将在函数第一次到达该点时退出函数-因此您的循环永远不会循环。
如果你想发送多条消息,你应该在for循环中使用node.send(msg);。唯一需要注意的是,如果你用同一个对象多次调用node.send,因为消息是通过引用传递的,你会得到一些奇怪的副作用。因为在这个例子中你只关心msg.topic,所以你可以负担得起每次创建一个新的消息对象。
因此,除了return msg语句,您还可以执行以下操作:

for (i ... ) {
   var out = "INSERT ...";
   ...

   node.send({topic: out});
}
// Return without any arguments so no further messages are sent.
return;

相关问题