Search code examples
javascriptnode.jsnode-red

Increasing the msg.payload[i] variable


I have a MySQL database with two columns: Username and Password. I want to list usernames one by one.

My Flow

The first function holds my database query:

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

The second function loops until it displays all database usernames. maxarray is the maximum number of usernames in my database.

var maxarray = global.get("maxarray");
var i;

for (i = 0; i < maxarray; i++) {
    msg.payload = msg.payload[i].Username;
    node.send(msg);
}

return;

Whenever I run this, it gives me an error:

"TypeError: Cannot read property '2' of undefined"

Here's my flow if you would like to import.

[{"id":"213ba9d6.1ba576","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"820a48f5.ff49d8","type":"debug","z":"213ba9d6.1ba576","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":490,"y":100,"wires":[]},{"id":"673daf0e.c65b8","type":"inject","z":"213ba9d6.1ba576","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"\"SELECT * FROM userlog\"","payload":"","payloadType":"date","x":100,"y":100,"wires":[["3724e918.bf5b86"]]},{"id":"dbe2587d.cfb7a8","type":"mysql","z":"213ba9d6.1ba576","mydb":"f1e0508e.13503","name":"db","x":290,"y":100,"wires":[["fd991622.c20928"]]},{"id":"3724e918.bf5b86","type":"function","z":"213ba9d6.1ba576","name":"msg.topic","func":"msg.topic = \"SELECT * FROM userlog\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":180,"y":140,"wires":[["dbe2587d.cfb7a8"]]},{"id":"fd991622.c20928","type":"function","z":"213ba9d6.1ba576","name":"for loop","func":"var i;\nvar array;\nfor (i = 0; i < msg.payload.length; i++) {\n    msg.payload = array[i].Username;\n    node.send(msg);\n}\nreturn;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":380,"y":140,"wires":[["820a48f5.ff49d8"]]},{"id":"f1e0508e.13503","type":"MySQLdatabase","name":"","host":"127.0.0.1","port":"3306","db":"test dump","tz":"","charset":"UTF8"}]

Solution

  • You need to take a copy of msg.payload before the loop as you've replaced it before sending the msg object.

    You should probably also be using the array length rather than trying to keep track in a global variable

    var i;
    var array = msg.payload
    
    for (i = 0; i < array.length; i++) {
        msg.payload = array[i].Username;
        node.send(msg);
    }
    
    return;