Why the object has double brackets after get back from a flow

Hi
I am currently develop a flow. The idea is a function node can aggregate multiple msg.payload in a pre-define JSON format. But, I am facing a strange problem, not sure why. Could you help me on this?
Below is my code block

Function node #1

var profile = [{"name":"test"}];
flow.set ("ProfileCache", profile);
return null;

Function node #2

console.log ("start");
cache = flow.get ("ProfileCache");
console.log ("Cache:"+JSON.stringify(cache));
for (var i in cache)
{
    console.log ("topic:"+msg.topic+ "  i:"+ i +"  name:"+cache[i].name);
}
return cache;

I run the Function node#1 first to set [{"name":"test"}] into flow w/ key "ProfileCache". Then I trigger the Function node#2 to show the result. Below is the result when I trigger it twice and more.

start

Cache:[{"name":"test"}]

topic: i:0 name:test.  **<=== this is what I want.**

start

Cache:[[{"name":"test","_msgid":"2f0f5de3.271b42"}]]

topic: i:0 name:undefined.   **<=== unexpectedly result.** 

start

Cache:[[{"name":"test","_msgid":"48506c12.3f3cd4"}]]

topic: i:0 name:undefined.  **<=== unexpectedly result.** 

flow on Node-Red version 0.19.0

[{"id":"c31d5fa6.553228","type":"function","z":"722f3d50.0bfb8c","name":"ProfileCache","func":"console.log (\"start\");\ncache = flow.get (\"ProfileCache\");\nconsole.log (\"Cache:\"+JSON.stringify(cache));\n\n// for (let i = 0 ; i < cache.length ; i++)\nfor (var i in cache)\n{\n    console.log (\"topic:\"+msg.topic+ \"  i:\"+ i +\"  name:\"+cache[i].name);\n}\n\nreturn cache;","outputs":1,"noerr":0,"x":1450,"y":340,"wires":[["735c94ef.b86424"]]},{"id":"735c94ef.b86424","type":"debug","z":"722f3d50.0bfb8c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":1630,"y":340,"wires":[]},{"id":"7d418003.8d84e8","type":"inject","z":"722f3d50.0bfb8c","name":"","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":1230,"y":340,"wires":[["c31d5fa6.553228"]]},{"id":"9370fa50.41e8b8","type":"inject","z":"722f3d50.0bfb8c","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"0.01","x":1230,"y":260,"wires":[["ed3d4143.0efc"]]},{"id":"ed3d4143.0efc","type":"function","z":"722f3d50.0bfb8c","name":"Profile","func":"var profile = [{\"name\":\"test\"}];\nflow.set (\"ProfileCache\", profile);\n\nreturn null;","outputs":1,"noerr":0,"x":1410,"y":260,"wires":[[]]}]

Then I aware the name result is undefined except first time. Not sure why a double brackets there.
Does any one know why?

Can you post your full flow ?
I tried to replicate and used node.warn instead of console.log and it seems to work fine.

Thanks for reply. I have update the flow.

There is something strange going on, cannot put my finger on it, but in the 2nd function node; return cache - which should that be returned ? change it into return null and it works.

ha~ it works after return the null on 2nd function node. To return cache just for debug, it is fine to me to return the null.

Try:

msg.payload = cache;
return msg;

It works. Do you know the root cause?

The function must always return a msg object. Returning a number or string will result in an error.

https://nodered.org/docs/user-guide/writing-functions

I think I find the reason. You post and link give me a idea.
The cache that I return was an array not an object. The Node-RED document said the brackets needed if you want to return an array directly. So I made the change to use brackets on cache and it goes well.

console.log ("start");
cache = flow.get ("test");
console.log ("Cache:"+JSON.stringify(cache));

for (var i in cache)
{
    console.log ("topic:"+msg.topic+ "  i:"+ i +"  name:"+cache[i].name);
}

return [cache];

Thank you all the help.
cheers

I'm not sure whether this is correct. I think it should be an array of messages:

... If there is more than one output, an array of messages can be returned by the function to send to the outputs.