PageSourceSearch

https://mpolinowski.github.io/assets/js/04b4f6e3.b1c33a49.js

js mpolinowski.github.io collected 2026-10-03 09:41:34 UTC 32,640 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkmikes_dev_notebook=globalThis.webpackChunkmikes_dev_notebook||[]).push([[22341],{800098(e,t,n){n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>d,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"Automation_and_Robotics/Home_Automation/2020-09-15--mock-rest-api-with-nodered/index","title":"A Mock REST API in Node-RED and Docker","description":"Koh Rong, Cambodia","source":"@site/docs/Automation_and_Robotics/Home_Automation/2020-09-15--mock-rest-api-with-nodered/index.md","sourceDirName":"Automation_and_Robotics/Home_Automation/2020-09-15--mock-rest-api-with-nodered","slug":"/Automation_and_Robotics/Home_Automation/2020-09-15--mock-rest-api-with-nodered/2020-09-16","permalink":"/docs/Automation_and_Robotics/Home_Automation/2020-09-15--mock-rest-api-with-nodered/2020-09-16","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Automation_and_Robotics/Home_Automation/2020-09-15--mock-rest-api-with-nodered/index.md","tags":[{"inline":true,"label":"LINUX","permalink":"/docs/tags/linux"},{"inline":true,"label":"Docker","permalink":"/docs/tags/docker"},{"inline":true,"label":"IoT","permalink":"/docs/tags/io-t"}],"version":"current","sidebarPosition":7080,"frontMatter":{"sidebar_position":7080,"slug":"2020-09-16","title":"A Mock REST API in Node-RED and Docker","authors":"mpolinowski","tags":["LINUX","Docker","IoT"]},"sidebar":"tutorialSidebar","previous":{"title":"Testing a new REST API in Node-RED","permalink":"/docs/Automation_and_Robotics/Home_Automation/2020-09-16--testing-new-rest-api-with-nodered/2020-09-16"},"next":{"title":"Loxone Miniserver","permalink":"/docs/Automation_and_Robotics/Home_Automation/2019-02-11--loxone-miniserver/2019-02-11"}}');var s=n(474848),r=n(28453);const o={sidebar_position:7080,slug:"2020-09-16",title:"A Mock REST API in Node-RED and Docker",authors:"mpolinowski",tags:["LINUX","Docker","IoT"]},d=void 0,i={},c=[{value:"Setting Up Node-RED",id:"setting-up-node-red",level:2},{value:"Accessing your API",id:"accessing-your-api",level:2},{value:"Creating the API Endpoint",id:"creating-the-api-endpoint",level:3},{value:"Converting your State Storage to YAML",id:"converting-your-state-storage-to-yaml",level:3},{value:"Accessing Keys",id:"accessing-keys",level:3}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Koh Rong, Cambodia",src:n(184690).A+"",width:"1500",height:"574"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#setting-up-node-red",children:"Setting Up Node-RED"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"#accessing-your-api",children:"Accessing your API"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#creating-the-api-endpoint",children:"Creating the API Endpoint"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#converting-your-state-storage-to-yaml",children:"Converting your State Storage to YAML"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#accessing-keys",children:"Accessing Keys"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"setting-up-node-red",children:"Setting Up Node-RED"}),"\n",(0,s.jsxs)(t.p,{children:["I want to create a JSON REST API in Node-RED to mock an IP camera interface. For this I am going to use the latest Node-RED Docker container from DockerHUB (Version 1.x). To persist my Node-RED flows I am going to create a ",(0,s.jsx)(t.code,{children:"nodered"})," folder on my host system and mount it into the Node-Container like:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"mkdir /opt/nodered\r\nmkdir /opt/nodered/data\n"})}),"\n",(0,s.jsx)(t.p,{children:"I am going to store my mock API data in JSON files inside the data folder - e.g.:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"mkdir /opt/nodered/data/api\r\nnano /opt/nodered/data/api/getuserattr.json\n"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\r\n    "at_user0": {\r\n        "at_username0": "admin",\r\n        "at_password0": "instar",\r\n        "at_authlevel0": "15",\r\n        "at_enable0": "on"\r\n    },\r\n    "at_user1": {\r\n        "at_username1": "user",\r\n        "at_password1": "instar",\r\n        "at_authlevel1": "3",\r\n        "at_enable1": "off"\r\n    },\r\n    "at_user2": {\r\n        "at_username1": "guest",\r\n        "at_password1": "instar",\r\n        "at_authlevel1": "1",\r\n        "at_enable1": "off"\r\n    }\r\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"To pull the image and run the container:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"docker run -ti -d -p 1880:1880 -v /opt/nodered/data:/data --name nodered nodered/node-red\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The container will now create the Node-RED configuration files inside the ",(0,s.jsx)(t.code,{children:"nodered"})," folder on your host. We now need to edit the ",(0,s.jsx)(t.code,{children:"settings.js"})," file to point the ",(0,s.jsx)(t.code,{children:"httpStatic"})," folder to ",(0,s.jsx)(t.code,{children:"/data/api"})," to make our JSON files available to the Node-RED dashboard."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"nano /opt/nodered/data/settings.js\n"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'module.exports = {\r\n\r\n    ...\r\n\r\n    // To password protect the node-defined HTTP endpoints (httpNodeRoot), or\r\n    // the static content (httpStatic), the following properties can be used.\r\n    // The pass field is a bcrypt hash of the password.\r\n    // See http://nodered.org/docs/security.html#generating-the-password-hash\r\n    //httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},\r\n    //httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},\r\n    httpStatic: \'/data/api\',\r\n\r\n    ...\r\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"You can now test that your file is available by typing in your Node-RED IP address, port and the name of your file - e.g.:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"http://192.168.2.111:1880/getuserattr.json\n"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Node-RED Mock API",src:n(97126).A+"",width:"691",height:"317"})}),"\n",(0,s.jsx)(t.h2,{id:"accessing-your-api",children:"Accessing your API"}),"\n",(0,s.jsx)(t.h3,{id:"creating-the-api-endpoint",children:"Creating the API Endpoint"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Node-RED Mock API",src:n(164541).A+"",width:"686",height:"137"})}),"\n",(0,s.jsx)(t.p,{children:"Creating a simple REST endpoint with Node-RED:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Use the HTTP input node to create a web hook. The
1n, edit the method ",(0,s.jsx)(t.code,{children:"GET"})," and the URL ",(0,s.jsx)(t.code,{children:"/getuserattr"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Use the file-in node that reads a file and sends its content in the payload of the message. Then, edit the filename ",(0,s.jsx)(t.code,{children:"/data/api/getuserattr.json"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"Use the JSON function node that converts the message to JSON."}),"\n",(0,s.jsx)(t.li,{children:"Use the HTTP response node that returns the message"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Node-RED Flow"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'[{"id":"487ea512.dbc46c","type":"http in","z":"21db30d1.ba9c7","name":"/getuserattr/json/","url":"/getuserattr/json/","method":"get","upload":false,"swaggerDoc":"","x":99,"y":77,"wires":[["6d2398bb.c34b68"]]},{"id":"6d2398bb.c34b68","type":"file in","z":"21db30d1.ba9c7","name":"getuserattr","filename":"/data/api/getuserattr.json","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":287,"y":77,"wires":[["ac6e6909.842c98"]]},{"id":"ac6e6909.842c98","type":"json","z":"21db30d1.ba9c7","name":"","property":"payload","action":"","pretty":false,"x":429,"y":76,"wires":[["3103ee5b.f1c682"]]},{"id":"3103ee5b.f1c682","type":"http response","z":"21db30d1.ba9c7","name":"","statusCode":"","headers":{},"x":552,"y":76,"wires":[]}]\n'})}),"\n",(0,s.jsx)(t.p,{children:"You can now access the JSON data via the URL you defined inside the HTTP-In node, e.g.:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"http://192.168.2.111:1880/getuserattr/json/\n"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Node-RED Mock API",src:n(943412).A+"",width:"809",height:"412"})}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:["You can use a ",(0,s.jsx)(t.a,{href:"https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa",children:"JSON formatter plugin"})," to beautify the JSON output"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"converting-your-state-storage-to-yaml",children:"Converting your State Storage to YAML"}),"\n",(0,s.jsx)(t.p,{children:"To make my state files more maintainable / readable I want to use YAML instead of JSON:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"nano /opt/nodered/data/api/getuserattr.yml\n"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yml",children:"at_user0:\r\n    at_username0: admin\r\n    at_password0: instar\r\n    at_authlevel0: '15'\r\n    at_enable0: on\r\nat_user1:\r\n    at_username1: user\r\n    at_password1: instar\r\n    at_authlevel1: '3'\r\n    at_enable1: off\r\nat_user2:\r\n    at_username1: guest\r\n    at_password1: instar\r\n    at_authlevel1: '1'\r\n    at_enable1: off\n"})}),"\n",(0,s.jsx)(t.p,{children:"We can access this data by swapping the JSON node with a YAML node:"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Node-RED Flow"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'[{"id":"f382171b.977008","type":"http in","z":"21db30d1.ba9c7","name":"/getuserattr/yaml/","url":"/getuserattr/yaml/","method":"get","upload":false,"swaggerDoc":"","x":108,"y":123,"wires":[["8077e62e.27ed98"]]},{"id":"8077e62e.27ed98","type":"file in","z":"21db30d1.ba9c7","name":"getuserattr","filename":"/data/api/getuserattr.json","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":286,"y":123,"wires":[["e258cdd1.7ac92"]]},{"id":"eb5058f9.f09328","type":"http response","z":"21db30d1.ba9c7","name":"","statusCode":"","headers":{},"x":551,"y":122,"wires":[]},{"id":"e258cdd1.7ac92","type":"yaml","z":"21db30d1.ba9c7","property":"payload","name":"","x":427,"y":122,"wires":[["eb5058f9.f09328"]]}]\n'})}),"\n",(0,s.jsxs)(t.p,{children:["Test the flow by accessing this URL: ",(0,s.jsx)(t.code,{children:"http://192.168.2.111:1880/getuserattr/yaml/"})]}),"\n",(0,s.jsx)(t.h3,{id:"accessing-keys",children:"Accessing Keys"}),"\n",(0,s.jsx)(t.p,{children:"The URL shown above always returns the entire glob of information. I now want to be able to query a single key out of it. As a proof of concept I added a function node with the following code and connected a inject and debug node to it. By clicking on the inject node I will trigger my function and see the output in the Node-RED debug panel:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-js",children:'const state = {"at_user0":{"at_username0":"admin","at_password0":"instar","at_authlevel0":"15","at_enable0":"on"},"at_user1":{"at_username1":"user","at_password1":"instar","at_authlevel1":"3","at_enable1":"off"},"at_user3":{"at_username1":"guest","at_password1":"instar","at_authlevel1":"1","at_enable1":"off"}};\r\nvar string = JSON.stringify(state);\r\nvar output = JSON.parse(string)\r\nmsg.payload = output.at_user0;\r\nreturn msg;\n'})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Node-RED Flow"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'[{"id":"ddc6d5a9.369d68","type":"function","z":"21db30d1.ba9c7","name":"","func":"const state = {\\"at_user0\\":{\\"at_username0\\":\\"admin\\",\\"at_password0\\":\\"instar\\",\\"at_authlevel0\\":\\"15\\",\\"at_enable0\\":\\"on\\"},\\"at_user1\\":{\\"at_username1\\":\\"user\\",\\"at_password1\\":\\"instar\\",\\"at_authlevel1\\":\\"3\\",\\"at_enable1\\":\\"off\\"},\\"at_user3\\":{\\"at_username1\\":\\"guest\\",\\"at_password1\\":\\"instar\\",\\"at_authlevel1\\":\\"1\\",\\"at_enable1\\":\\"off\\"}};\\nvar string = JSON.stringify(state);\\nvar output = JSON.parse(string)\\nmsg.payload = output.at_user0;\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":250,"y":440,"wires":[["60a5053d.d911fc"]
1]},{"id":"59a61cb4.46ddd4","type":"inject","z":"21db30d1.ba9c7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":90,"y":440,"wires":[["ddc6d5a9.369d68"]]},{"id":"60a5053d.d911fc","type":"debug","z":"21db30d1.ba9c7","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":420,"y":440,"wires":[]}]\n'})}),"\n",(0,s.jsxs)(t.p,{children:["By setting the ",(0,s.jsx)(t.code,{children:"msg.payload"})," to ",(0,s.jsx)(t.code,{children:"output.at_user0"})," I will now ingest the entire information but only print the user data for my first user."]}),"\n",(0,s.jsxs)(t.p,{children:["We can now create 1 route that returns the entire user state, as well as 3 additional routes that only return the state of one of the users: ",(0,s.jsx)(t.code,{children:"at_user0"}),", ",(0,s.jsx)(t.code,{children:"at_user1"}),", ",(0,s.jsx)(t.code,{children:"at_user2"})," by adding a function node that filters for ",(0,s.jsx)(t.code,{children:"output.at_user0"}),", ",(0,s.jsx)(t.code,{children:"output.at_user1"})," or ",(0,s.jsx)(t.code,{children:"output.at_user2"}),":"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Node-RED Mock API",src:n(235403).A+"",width:"842",height:"229"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Node-RED Flow"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'[{"id":"78862c12.e12b64","type":"http in","z":"21db30d1.ba9c7","name":"/getuserattr/","url":"/getuserattr/","method":"get","upload":false,"swaggerDoc":"","x":90,"y":312,"wires":[["daa48d2d.58606"]]},{"id":"daa48d2d.58606","type":"file in","z":"21db30d1.ba9c7","name":"getuserattr","filename":"/data/api/getuserattr.yml","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":248,"y":312,"wires":[["239bf6bc.ff85ea"]]},{"id":"3dd619a9.3d6496","type":"http response","z":"21db30d1.ba9c7","name":"","statusCode":"","headers":{},"x":500,"y":312,"wires":[]},{"id":"bc3d1a73.5b07d8","type":"http in","z":"21db30d1.ba9c7","name":"/at_user0/","url":"/at_user0/","method":"get","upload":false,"swaggerDoc":"","x":80,"y":352,"wires":[["74fda1d3.91845"]]},{"id":"74fda1d3.91845","type":"file in","z":"21db30d1.ba9c7","name":"getuserattr","filename":"/data/api/getuserattr.yml","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":230,"y":352,"wires":[["a9310d0.dff79f"]]},{"id":"6aa3299b.46a838","type":"http response","z":"21db30d1.ba9c7","name":"","statusCode":"","headers":{},"x":658,"y":352,"wires":[]},{"id":"a39ea2b0.12d6e","type":"function","z":"21db30d1.ba9c7","name":"GET at_user0","func":"const state = msg.payload;\\nvar string = JSON.stringify(state);\\nvar output = JSON.parse(string)\\nmsg.payload = output.at_user0;\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":513,"y":352,"wires":[["6aa3299b.46a838"]]},{"id":"239bf6bc.ff85ea","type":"yaml","z":"21db30d1.ba9c7","property":"payload","name":"","x":383,"y":312,"wires":[["3dd619a9.3d6496"]]},{"id":"a9310d0.dff79f","type":"yaml","z":"21db30d1.ba9c7","property":"payload","name":"","x":365,"y":352,"wires":[["a39ea2b0.12d6e"]]},{"id":"eb9d312.ed1bad","type":"comment","z":"21db30d1.ba9c7","name":"User Data Test","info":"","x":100,"y":269,"wires":[]},{"id":"97f0f0a4.8fc9f","type":"http in","z":"21db30d1.ba9c7","name":"/at_user1/","url":"/at_user1/","method":"get","upload":false,"swaggerDoc":"","x":80,"y":392,"wires":[["6e5b944b.2a65ac"]]},{"id":"6e5b944b.2a65ac","type":"file in","z":"21db30d1.ba9c7","name":"getuserattr","filename":"/data/api/getuserattr.yml","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":230,"y":392,"wires":[["b7153106.4fb8b"]]},{"id":"53d49f55.ab3a4","type":"http response","z":"21db30d1.ba9c7","name":"","statusCode":"","headers":{},"x":658,"y":392,"wires":[]},{"id":"67c2d2b5.33cc1c","type":"function","z":"21db30d1.ba9c7","name":"GET at_user1","func":"const state = msg.payload;\\nvar string = JSON.stringify(state);\\nvar output = JSON.parse(string)\\nmsg.payload = output.at_user1;\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":513,"y":392,"wires":[["53d49f55.ab3a4"]]},{"id":"b7153106.4fb8b","type":"yaml","z":"21db30d1.ba9c7","property":"payload","name":"","x":365,"y":392,"wires":[["67c2d2b5.33cc1c"]]},{"id":"6fdaf17e.ab1a2","type":"http in","z":"21db30d1.ba9c7","name":"/at_user2/","url":"/at_user2/","method":"get","upload":false,"swaggerDoc":"","x":80,"y":432,"wires":[["75bfaf5b.6a47"]]},{"id":"75bfaf5b.6a47","type":"file in","z":"21db30d1.ba9c7","name":"getuserattr","filename":"/data/api/getuserattr.yml","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":230,"y":432,"wires":[["1eb745e3.f1861a"]]},{"id":"e7eb5dfb.34328","type":"http response","z":"21db30d1.ba9c7","name":"","statusCode":"","headers":{},"x":658,"y":432,"wires":[]},{"id":"8d47135.f8c08f","type":"function","z":"21db30d1.ba9c7","name":"GET at_user2","func":"const state = msg.payload;\\nvar string = JSON.stringify(state);\\nvar output = JSON.parse(string)\\nmsg.payload = output.at_user2;\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":513,"y":432,"wires":[["e7eb5dfb.34328"]]}
1,{"id":"1eb745e3.f1861a","type":"yaml","z":"21db30d1.ba9c7","property":"payload","name":"","x":365,"y":432,"wires":[["8d47135.f8c08f"]]}]\n'})}),"\n",(0,s.jsx)(t.p,{children:"We now created 4 API enpoints (web hooks) that allow us to either ask for the entire user state or for the state of a specific user:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"http://192.168.2.111:1880/getuserattr/\r\nhttp://192.168.2.111:1880/at_user0/\r\nhttp://192.168.2.111:1880/at_user1/\r\nhttp://192.168.2.111:1880/at_user2/\n"})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},97126(e,t,n){const a=n.p+"assets/images/Mock_API_in_Node-RED_01-776284fe7261bb3cb3583ea70dce1cee.png";n.d(t,["A",0,a])},164541(e,t,n){n.d(t,["A",0,"data:image/png;base64,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"])},943412(e,t,n){const a=n.p+"assets/images/Mock_API_in_Node-RED_03-0f80b8b7d00c7093814d0e21fae9a9b7.png";n.d(t,["A",0,a])},235403(e,t,n){const a=n.p+"assets/images/Mock_API_in_Node-RED_04-ef13c87dd88b74760b3b3bb2d86cca4c.png";n.d(t,["A",0,a])},184690(e,t,n){const a=n.p+"assets/images/photo-kt443t6d_64hdh43hfh6dgjdfhg4_d-bb1cb7969c492d0795741dc686f072b6.jpg";n.d(t,["A",0,a])},28453(e,t,n){n.d(t,{R:()=>o,x:()=>d});var a=n(296540);const s={},r=a.createContext(s);function o(e){const t=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.