Node-RED HTTP 노드에서 클라이언트의 IP 주소 얻기

15549 단어 IP 주소node-redHTTP
본래 취득하고 싶었던 것은 Node-RED의 dashboard에 접속하고 있는 클라이언트의 IP 주소였지만, HTTP 노드를 이용하는 방법에 침착했다.

방법



http in 노드에서 엔드포인트를 작성하고 function 노드에서 검색합니다.



function 노드의 내용
msg.payload = msg.req.ip;
return msg;

흐름
[{"id":"9dad23b5.fd644","type":"http response","z":"4e3881be.18f2e","name":"","statusCode":"","headers":{},"x":550,"y":820,"wires":[]},{"id":"ea07abe6.815c98","type":"http in","z":"4e3881be.18f2e","name":"","url":"/clientip","method":"get","upload":false,"swaggerDoc":"","x":160,"y":820,"wires":[["a30561c.749e7a"]]},{"id":"a30561c.749e7a","type":"function","z":"4e3881be.18f2e","name":"set client ip to payload","func":"msg.payload = msg.req.ip;\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":820,"wires":[["9dad23b5.fd644"]]}]

이 흐름을 배포하고 http://[node-redのhost]/clientip에 액세스하면 클라이언트의 IP 주소가 표시됩니다.

포인트



http in 노드에서 나오는 msg를 debug 노드에서 봐도 msg.res.ip라는 요소를 찾을 수 없지만 Node-RED는 HTTP에 Express를 사용하고 있기 때문에 Express의 요소를 사용할 수있는 것 같습니다.

참고


  • Expressjs 참조 req.ip 섹션
  • Http in - remote address - Google 그룹스

  • 대시보드에서 이 API에 액세스



    자, HTTP의 API가 생겼기 때문에 dashboard로 액세스할까, 라고 생각해 아래의 플로우를 작성.





    그러나 반환 클라이언트의 IP 주소는 127.0.0.1 Node-RED 호스트에서 자신의 API에 HTTP를 요청하고 있기 때문에 당연합니다 ...

    어쩔 수 없이 dashboard template 노드를 사용해, 제대로 클라이언트측으로부터 HTTP 리퀘스트가 날아가게 했다.



    template 노드의 내용
    <script>
    this.scope.action = function() {
        let xhr = new XMLHttpRequest();
        xhr.open("GET", "../clientip", false);
        try {
            xhr.send();
            if (xhr.status != 200) {
                return `Error ${xhr.status}: ${xhr.statusText}`;
            } else {
                return xhr.response;
            }
        } catch(err) {
            return "Request failed";
        }
    }
    </script>
    <md-button ng-click="send({payload:action()})">
        Get IP Address
    </md-button>
    

    흐름
    [{"id":"5eb60b39.a89a64","type":"ui_template","z":"4e3881be.18f2e","group":"4e09a2b6.c91f8c","name":"[button]Get IP Address","order":2,"width":0,"height":0,"format":"<script>\nthis.scope.action = function() {\n    let xhr = new XMLHttpRequest();\n    xhr.open(\"GET\", \"../clientip\", false);\n    try {\n        xhr.send();\n        if (xhr.status != 200) {\n            return `Error ${xhr.status}: ${xhr.statusText}`;\n        } else {\n            return xhr.response;\n        }\n    } catch(err) {\n        return \"Request failed\";\n    }\n}\n</script>\n<md-button ng-click=\"send({payload:action()})\">\n    Get IP Address\n</md-button>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":300,"y":1060,"wires":[["2f5c3897.ce4548"]]},{"id":"2f5c3897.ce4548","type":"debug","z":"4e3881be.18f2e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":510,"y":1060,"wires":[]},{"id":"4e09a2b6.c91f8c","type":"ui_group","z":"","name":"デフォルト","tab":"531fac22.ff06a4","disp":true,"width":"6","collapse":false},{"id":"531fac22.ff06a4","type":"ui_tab","z":"","name":"ホーム","icon":"dashboard","disabled":false,"hidden":false}]
    

    이제 제대로 dashboard에서 클라이언트의 IP 주소를 얻을 수 있었다.

    좋은 웹페이지 즐겨찾기