Javascript For循环在SQL中插入多行

Javascript For循环在SQL中插入多行,javascript,mysql,sql,node-red,Javascript,Mysql,Sql,Node Red,我有以下传入有效负载: 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_报警表): for ( i = 0; i < msg.payload.length; i++){

我有以下传入有效负载:

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_报警表):

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}
}
for(i=0;i

我正在尝试解析传入的有效负载,并让它在opt_alarms表中的单独一行中列出传入数组中的每个值。如有任何建议,将不胜感激。

如果您试图在循环内使用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规范的输入进行清理。

如果您试图在循环内使用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规范的输入进行清理。

@Chris Travers解决方案非常有效,如果您希望为
msg.payload
中的每个值都有一个INSERT语句。经过如下修改:

>
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')

@如果您想为
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')

我认为您错过了VALUES语句的右括号,否则这是一个好的解决方案:)我认为您错过了VALUES语句的右括号,否则这是一个好的解决方案:)您不想从函数返回,因为这将在第一次循环时退出整个函数,您需要
node.send(msg}
您不希望从函数返回,因为这将在循环的第一次循环中退出整个函数,您需要
node.send(msg}