# How to add new level in Json global context file

**URL:** <https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221>\
**Category:** General\
**Created:** [28 October 2019 10:06 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221 "2019-10-28T10:06:17Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [28 October 2019 10:06 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/1 "2019-10-28T10:06:17Z")

</div>

Hello,  
I'm new in node-red univers, sorry if I ask basic questions....  
I would like to add a new level in the global.json file from a JS function node.

I would like my global.json looks like that :

```auto
{
   "A":{
      "1":{
          "info_1":"true",
          "info_2":"false",
          "info_3":"false"
           },
      "2":{
          "info_1":"false",
          "info_2":"false",
          "info_3":"true"
           }
   },
   "B":{
      "1":{
          "info_1":"true",
          "info_2":"false",
          "info_3":"false"
           },
      "2":{
          "info_1":"false",
          "info_2":"false",
          "info_3":"true"
           }
   }
}

```

How can I add new level in this file like for exemple a third level in "A" ?

```auto
"3":{
          "info_1":"false",
          "info_2":"false",
          "info_3":"true"
           }

```

To have :

```auto
{
   "A":{
      "1":{
          "info_1":"true",
          "info_2":"false",
          "info_3":"false"
           },
      "2":{
          "info_1":"false",
          "info_2":"false",
          "info_3":"true"
           },
       "3":{
          "info_1":"false",
          "info_2":"false",
          "info_3":"true"
           }
   },
   "B":{
      "1":{
          "info_1":"true",
          "info_2":"false",
          "info_3":"false"
           },
      "2":{
          "info_1":"false",
          "info_2":"false",
          "info_3":"true"
           }
   }
}

```

Hoping to have been clear...  
Thank you

Sorry for my English, I'm French..

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [28 October 2019 10:16 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/2 "2019-10-28T10:16:42Z")

</div>

> [@emerichrv](#):
>
> I would like to add a new level in the global.json file from a JS function node.

This is the global context store, so you can use the `global.set()` function to write whatever values you want.

For example:

```auto
var currentValue = global.get("A");
currentValue["3"] = {
    "info_1":"false",
    "info_2":"false",
    "info_3":"true"
}
global.set("A",currentValue);

The docs for working with context in the Function node are here: https://nodered.org/docs/user-guide/writing-functions#storing-data
```

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [28 October 2019 10:26 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/3 "2019-10-28T10:26:54Z")

</div>

Thank you for the answer, when i do that i have that error :  
`TypeError: Cannot set property '3' of undefined`

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [28 October 2019 10:31 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/4 "2019-10-28T10:31:53Z")

</div>

How did you set the contents of global.json to being with?

I have assumed this is the global context file store and you have enabled file-based persistence of context. If that is not the case, and this `global.json` file is something you've created yourself, then please describe what you have done.

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [28 October 2019 11:37 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/5 "2019-10-28T11:37:16Z")

</div>

This is my code in a JS Node wich is connected to a MQTT input Node.

```auto
var topic=msg.topic;
var value=msg.payload;
var array = topic.split("/");
var chambre = array[0];
var type = array[1];
var etage

msg.payload={"chambre":chambre,"type":type,"value":value};

if (chambre != "general"){

var num_ch_etage = parseInt(msg.payload.chambre || 0);
if (num_ch_etage > 1 && num_ch_etage < 99){
	etage = "RDC";
}
if (num_ch_etage > 101 && num_ch_etage < 199){
	etage = "R+1";
}
if (num_ch_etage > 201 && num_ch_etage < 299){
	etage = "R+2";
}
if (num_ch_etage > 301 && num_ch_etage < 399){
	etage = "R+3";
}

var object = {
     [chambre] : {
		alarme:"",
		etat_systeme:"",
		adresse_ip:"",
		SoftVersion:"",
		capteur_lit:"",
		capteur_porte:"",
		nom:"",
		trame_vie:"",
		num_chambre: chambre
	 }
}

msg.payload=global.get(chambre);
if (msg.payload === undefined){
    global.set(etage,object,"file");
}
msg.payload=global.get(chambre);

var alarme = msg.payload.alarme;
var etat_systeme = msg.payload.etat_systeme;
var adresse_ip = msg.payload.adresse_ip;
var SoftVersion = msg.payload.SoftVersion;
var capteur_porte = msg.payload.capteur_porte;
var capteur_lit = msg.payload.capteur_lit;
var nom = msg.payload.nom;
var trame_vie = msg.payload.trame_vie;
var num_chambre = msg.payload.num_chambre;

if (type=="alarme"){
    if (value!=alarme){
        msg.payload.alarme=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="etat_systeme"){
    if (value!=etat_systeme){
        msg.payload.etat_systeme=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="adresse_ip"){
    if (value!=adresse_ip){
        msg.payload.adresse_ip=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="SoftVersion"){
    if (value!=SoftVersion){
        msg.payload.SoftVersion=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="capteur_porte"){
    if (value!=capteur_porte){
        msg.payload.capteur_porte=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="capteur_lit"){
    if (value!=capteur_lit){
        msg.payload.capteur_lit=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="nom"){
    if (value!=nom){
        msg.payload.nom=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="trame_vie"){
    if (value!=trame_vie){
        msg.payload.trame_vie=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

if (type=="num_chambre"){
    if (value!=num_chambre){
        msg.payload.num_chambre=value;
        object=msg.payload;
        global.set(etage,object,"file");
    }
}

msg.payload=global.get(chambre);

}
return msg;

```

This is my global.json file :

```auto
{
    "RDC": {
        "002": {
            "alarme": "",
            "etat_systeme": "",
            "adresse_ip": "",
            "SoftVersion": "",
            "capteur_lit": "",
            "capteur_porte": "",
            "nom": "",
            "trame_vie": "",
            "num_chambre": "002"
        }
    },
    "R+1": {
        "102": {
            "alarme": "",
            "etat_systeme": "",
            "adresse_ip": "",
            "SoftVersion": "",
            "capteur_lit": "",
            "capteur_porte": "",
            "nom": "",
            "trame_vie": "",
            "num_chambre": "102"
        }
    }
}

```

but i have this error :

```auto
TypeError: Cannot read property 'alarme' of undefined

```

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [28 October 2019 11:47 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/6 "2019-10-28T11:47:19Z")

</div>

> [@emerichrv](#):
>
> ```auto
> global.set(etage,object,"file");
> 
> ```

So this was the missing information - you are using a non-default store for context - `"file"`. The code I provided didn't know you were doing that so didn't specify the right context store.

Did you try changing the code I provided to use the same store?

```auto
var currentValue = global.get("A","file");
currentValue["3"] = {
    "info_1":"false",
    "info_2":"false",
    "info_3":"true"
}
global.set("A",currentValue,"file");

```

In fact, I can see you code doesn't use `"file"` consistently:

> [@emerichrv](#):
>
> ```auto
> msg.payload=global.get(chambre);
> if (msg.payload === undefined) {
> global.set(etage,object,"file");
> }
> msg.payload=global.get(chambre);
> 
> ```

Here you get the value from default context identified by the value of `chambre`. You check if it is undefined and then set something in `file` context.  
You then get the `chambre` object back from normal context and use it, ignoring the fact it may be undefined.

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [28 October 2019 11:55 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/7 "2019-10-28T11:55:18Z")

</div>

I modify the code to always use ` file` context but i still have the same error

```auto
msg.payload=global.get(chambre,"file");
if (msg.payload === undefined) {
   global.set(etage,object,"file");
}
msg.payload=global.get(chambre"file");

```

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [28 October 2019 12:00 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/8 "2019-10-28T12:00:08Z")

</div>

> [@emerichrv](#):
>
> ```auto
> msg.payload=global.get(chambre,"file");
> if (msg.payload === undefined) { global.set(etage,object,"file"); } 
> msg.payload=global.get(chambre"file");
> 
> ```

Line 1 gets the value.  
Line 2 checks the value is undefined and if it is, sets a different property in context  
Line 3 gets the value again - same as Line 1.

You have code in line 2 that handles the case if `msg.payload` is undefined, but it leaves `msg.payload` undefined. So when you try to reference `msg.payload.alarme` you get the error because `msg.payload` is undefined.

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [28 October 2019 12:49 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/9 "2019-10-28T12:49:47Z")

</div>

`global.get(chambre,"file")` can be traduct by `global.get("002","file")` if we don't use variable.

`"002"` is a sub-object in my global.json file how can I get this sub-object ? should I  
specify in which object is my sub-oject ? Cause `"002"` is the sub-objet of `"RDC"`.

does there is a syntaxe to do this ? like `global.get("RDC","002","file")` ??

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [29 October 2019 08:14 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/10 "2019-10-29T08:14:51Z")

</div>

No idea please ? I'm stuck.  
When I use `global.get("RDC")` I get all sub-objects but I can't do `msg.payload.002` or  
`msg.payload.chambre` (`chambre` is a variable)

> [@emerichrv](#):
>
> does there is a syntaxe to do this ? like `global.get("RDC","002","file")` ??

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [29 October 2019 08:21 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/11 "2019-10-29T08:21:07Z")

</div>

If you do `global.get("RDC")` and want to access the `002` level under it, you should be able to do:

```auto
var prop = global.get("RDB","file");
var subProp = prop["002"];
//or
var subProp2 = prop[chambre];

```

Or you could do:

```auto
var subProp = global.get("RBD.002","file");

```

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [29 October 2019 08:28 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/12 "2019-10-29T08:28:24Z")

</div>

Thank you,

And can I do this ? :

```auto
var etage ="RDC";
var chambre = "002";
var subProp = global.get(etage.chambre,"file");

```

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [29 October 2019 08:31 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/13 "2019-10-29T08:31:22Z")

</div>

No, that is not valid javascript.

You need to build the string `"RDB.002"`:

```auto
var etage ="RDC";
var chambre = "002";
var subProp = global.get(etage+"."+chambre,"file");

```

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [29 October 2019 08:43 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/14 "2019-10-29T08:43:07Z")

</div>

When I use your code it works but when I use mine I got an error

MQTT sending this : `102/alarme` payload : `"1"`

My code :

```auto
var topic=msg.topic;
var value=msg.payload;
var array = topic.split("/");
var chambre = array[0];
var type = array[1];
var etage

msg.payload={"chambre":chambre,"type":type,"value":value};

var num_ch_etage = parseInt(msg.payload.chambre || 0);
if (num_ch_etage > 1 && num_ch_etage < 99){
	etage = "RDC";
}
if (num_ch_etage > 101 && num_ch_etage < 199){
	etage = "R+1";
}
if (num_ch_etage > 201 && num_ch_etage < 299){
	etage = "R+2";
}
if (num_ch_etage > 301 && num_ch_etage < 399){
	etage = "R+3";
}

var subProp = global.get(etage+"."+chambre,"file");

msg.payload=subProp

return msg;

```

the error : `102/alarme : msg.payload : undefined`

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [29 October 2019 08:56 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/15 "2019-10-29T08:56:20Z")

</div>

Add some `node.warn(“debug1=“+some_variable);` in your code to dump info to the debug. That way you can see what is happening in your code.

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [29 October 2019 09:10 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/16 "2019-10-29T09:10:04Z")

</div>

Where should i put that in my code ? I got an error when I add this line

```auto
SyntaxError: Invalid or unexpected token

```

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [29 October 2019 09:22 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/17 "2019-10-29T09:22:53Z")

</div>

Ok I found an error in my global.json file when i make tests...

```auto
var subProp = global.get(etage+"."+chambre,"file");

```

That works good ! Thank you a lot @knolleary

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [29 October 2019 09:45 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/18 "2019-10-29T09:45:13Z")

</div>

I hope you didn't just copy/paste it, you would need to make sure the double quotes are not 'smart' double quotes and change `some_variable` to the variable you want to display

---

<div class="post-metadata">

**Author:** ![emerichrv](https://avatars.discourse-cdn.com/v4/letter/e/2bfe46/32.png) [@emerichrv](https://discourse.nodered.org/u/emerichrv)\
**Post date:** [29 October 2019 09:55 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/19 "2019-10-29T09:55:03Z")

</div>

No I didn't copy/past I changed `some_variable` but I don't really know which variable use...

I got `[warn] [function:18921846.d1d798] debug1=`

but nothing more...

But I resolve my error so I don't really need this command ...

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [29 October 2019 11:29 UTC](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221/20 "2019-10-29T11:29:51Z")

</div>

you could have used

```auto
var topic=msg.topic;
var value=msg.payload;
var array = topic.split("/");
var chambre = array[0];
var type = array[1];
var etage

node.warn(“value=“+value);
node.warn(“ array =“+ array);

```

anything you want. It's just a way of seeing what yo are working and if the logic of you function is working the way you `want` it to or the way you `told` it to. 😆

[Next page](https://discourse.nodered.org/t/how-to-add-new-level-in-json-global-context-file/17221.md?page=2)
