Création variable global

Bonjour la communauté

J’ai un souci de création et utilisation de variable [syntaxe]
j’arrive à

msg.id = "test"
context.flow.set(msg.id, {});

dans le context de mon flow je me retrouve bien avec une variable test {}.
plus tard, je cherche à créer une clé/valeur dans test

var temp = context.flow.get(msg.id);
temp["new_position"] = 100;

j’ai l’erreur « Error: Invalid context key ». Auriez-vous une idée de comment syntaxer ceci.
msg.id est fournit en amont et change en fonction de l’appelant, j’en ai donc besoin pour identifier qui à mis à jour.

Merci pour vos connaissances

Il faudrait regarder ici Writing Functions : Node-RED
Il y a déjà un premier niveau de confusion. Le titre du poste « Création variable global » semble traiter de variables globales (!).
Dans le code, j’imagine des morceaux de fonctions, il y a un mélange entre context et flow.
La syntaxe context.flow.get est donc, je pense, incorrecte.

Ensuite, j’ai aussi l’impression que tu as imaginé un truc compliqué à faire dans une fonction. Est-ce que tu prends le problème par le bon bout ?
En NodeRed, écrire une fonction est à éviter tant que l’on peut.
Le change node, typiquement, permet de manipuler les variables « simplement ».

Oui tu as tout à fait raison, j’aurai du parler de variable de flow.

En relisant plus correctement le document (je l’avais parcouru il y a un moment) j’ai effectivement supprimé context. car c’est bien une variable de flow dont j’ai besoin.( J’ai besoin de récupérer sa valeur ors de futur exécution)

J’ai regardé avec un node change mais je suis confronté au même souci: comment je crée une variable de flow dont l’étiquette à pour valeur la valeur d’un topic.

Si msg.topic = « titi », je dois créer une variable de flow nommé « titi » puis dans cette objet appelé « titi », je dois stocker une suite de valeur, soit par objet JSON, soit par tableau. (exemple titi.abc)

Lors d’une autre exécution, msg.topic sera égale à « toto » et en passant dans le flow devra créer une variable « toto ».

Lors d’une troisième exécution, j’aurais potentiellement msg.topic qui reviendra à « titi ». Il me faudra aller chercher la valeur titi.abc créée lors d’un premier passage.

C’est pas simple à expliquer, j’espère que c’est plus clair

Pas sur d’avoir compris…
C’est un truc de ce genre là ?

[
    {
        "id": "f017d50b7bbab873",
        "type": "function",
        "z": "f6f2187d.f17ca8",
        "name": "function 1",
        "func": "let mon_topic = msg.topic;\nlet valeurs = {};\n\nvaleurs.prems = msg.payload;\n\nflow.set(mon_topic, valeurs);\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 440,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "ee917784785b10d7",
        "type": "inject",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "props": [
            {
                "p": "topic",
                "vt": "str"
            },
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "toto",
        "payload": "1000",
        "payloadType": "num",
        "x": 280,
        "y": 420,
        "wires": [
            [
                "f017d50b7bbab873"
            ]
        ]
    },
    {
        "id": "fe8991806d7fdaaf",
        "type": "inject",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "toto",
        "payload": "",
        "payloadType": "date",
        "x": 270,
        "y": 480,
        "wires": [
            [
                "1546755f38d53792"
            ]
        ]
    },
    {
        "id": "1546755f38d53792",
        "type": "debug",
        "z": "f6f2187d.f17ca8",
        "name": "debug 303",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "$flowContext(\"toto\")",
        "targetType": "jsonata",
        "statusVal": "",
        "statusType": "auto",
        "x": 450,
        "y": 480,
        "wires": []
    }
]

Oui c’est ça mes explications ne devaient pas être si mauvaises :sweat_smile:

Voici un exemple de ce que j’ai testé suite à ton exemple.

[{"id":"9e1281ab5212bef7","type":"inject","z":"fa0087567b2aa6e5","name":"","props":[{"p":"id","v":"toto","vt":"str"},{"p":"topic","v":"10","vt":"num"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":420,"wires":[["afc48bf3967bc5d8"]]},{"id":"afc48bf3967bc5d8","type":"function","z":"fa0087567b2aa6e5","name":"function 18","func":"let id = msg.id;\nflow.set(id, {});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":420,"wires":[["c4b2131792f7d967"]]},{"id":"c4b2131792f7d967","type":"function","z":"fa0087567b2aa6e5","name":"function 19","func":"let valeur = {};\nlet id = msg.id\n\nvaleur.prems = msg.topic;\n\nflow.set(msg.id,valeur)\n//Jusque là c'est bon\n\nlet temp = flow.get(id.prems)\n\nnode.status({fill:\"green\",shape:\"ring\",text:flow.get(id.prems)});\n\n/* A ce moment j'ai \nError: Invalid context key*/\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":420,"wires":[[]]}]

En fin de code je souhaite récupérer la valeur pour l’afficher c’est là que j’ai l’erreur:

Error: Invalid context key

Ne connaissant pas la valeur de msg.toto à l’avance il me faut la récupérer au moment.

Avec mon exemple j’espère que ce sera plus simple pour toi mais c’est la bonne piste merci

C’est j’ai trouvé. Il fallait que je charge l’objet avant d’y accéder

[{"id":"9e1281ab5212bef7","type":"inject","z":"fa0087567b2aa6e5","name":"","props":[{"p":"id","v":"toto","vt":"str"},{"p":"topic","v":"10","vt":"num"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":420,"wires":[["afc48bf3967bc5d8"]]},{"id":"afc48bf3967bc5d8","type":"function","z":"fa0087567b2aa6e5","name":"function 18","func":"flow.set(msg.id, {});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":420,"wires":[["c4b2131792f7d967"]]},{"id":"c4b2131792f7d967","type":"function","z":"fa0087567b2aa6e5","name":"function 19","func":"let valeur = {};\n\nvaleur.prems = msg.topic;\n\nflow.set(msg.id,valeur)\nlet temp = flow.get(msg.id);\nlet temp1 = temp.prems;\n\nnode.status({fill:\"green\",shape:\"ring\",text:temp1});\n\nmsg.payload = temp1;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":420,"wires":[["e6e6b7fd5fbc696e"]]},{"id":"e6e6b7fd5fbc696e","type":"debug","z":"fa0087567b2aa6e5","name":"debug 304","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":870,"y":420,"wires":[]}]

Si mon exemple peut aider.

Encore merci à toi @golfvert