我有以下传入的有效载荷:
msg.payload : array [16]
[ "C-2B", "C-3A", "C-3B", "C-3C", "C-3E", "C-3F", "C-4A", "C-4B", "C-4D", "C-4E", "C-4F", "C-5A", "C-5B", "C-5C", "C-5D", "C-5E" ]
上述有效负载正在输入以下功能节点(然后将转发到相应的opt_alarms表:
for ( i = 0; i < msg.payload.length; i++){
insert = "INSERT INTO opt_alarms VALUES (now(),'RECEIVING', '"+ String(msg.payload[i]) +"')";
return {topic:insert, payload:insert}
}
我正在尝试解析传入的有效负载,并让它从传入的数组中列出该opt_alarms TABLE中单独一行的每个值。任何建议将不胜感激。
答案 0 :(得分:2)
如果您尝试在循环内使用return,我建议使用map
而不是for循环。所以不是for循环:
var statements = msg.payload.map(function(x){
return "INSERT INTO opt_alarms VALUES (now(),'RECEIVING', '" + string(x) + "'";
});
这并不完全等效,但由于您在两者中创建了一个具有相同sql的双元素对象,因此它至少会将值数组转换为SQL语句数组。
这不是SQL注入安全的,因此您需要仔细查看是否支持参数化查询,如果没有,请确保您清理对MySQL规范的输入。
答案 1 :(得分:1)
msg.payload
中的每个值都有一个INSERT语句,那么@Chris Travers解决方案效果很好。通过这样的一些修改:
var insertIntoSql = "INSERT INTO opt_alarms VALUES " + msg.payload.map(function(x){
return "(now(),'RECEIVING', '" + String(x) + "')";
}).join(',');
您可以使用以下单个INSERT语句:
INSERT INTO opt_alarms VALUES
(now(),'RECEIVING', 'C-2B'),(now(),'RECEIVING', 'C-3A'),(now(),'RECEIVING', 'C-3B'),(now(),'RECEIVING', 'C-3C'),(now(),'RECEIVING', 'C-3E'),(now(),'RECEIVING', 'C-3F'),(now(),'RECEIVING', 'C-4A'),(now(),'RECEIVING', 'C-4B'),(now(),'RECEIVING', 'C-4D'),(now(),'RECEIVING', 'C-4E'),(now(),'RECEIVING', 'C-4F'),(now(),'RECEIVING', 'C-5A'),(now(),'RECEIVING', 'C-5B'),(now(),'RECEIVING', 'C-5C'),(now(),'RECEIVING', 'C-5D'),(now(),'RECEIVING', 'C-5E')