Node-REDを導入してみた

Node-REDがかなり便利だった

いま開発している機械学習系のプロジェクトで、外部のAPIと連携させる必要があったのでNode-REDを導入してみました。

Node-REDを使うと、ハードウェアデバイス・API・オンラインサービスなどと連携するFlowをブラウザ上でヴィジュアル的に編集できるようになります。

Node.jsがインストール済みならば以下のコマンドでインストールできます。

$ npm install node-red

Node-REDはlatestバージョンのNode.jsが推奨されているので、Node.jsのバージョンが古いならばアップデートさせておくと良いでしょう。

Node-REDのファイル構成

現時点のNode-REDのファイル構成は以下の通りです。

└─┬ node-red@0.16.2
  ├── basic-auth@1.1.0
  ├─┬ bcrypt@1.0.2
  │ ├── bindings@1.2.1
  │ ├── nan@2.5.0
  │ └─┬ node-pre-gyp@0.6.32
  │   ├─┬ mkdirp@0.5.1
  │   │ └── minimist@0.0.8
  │   ├─┬ npmlog@4.0.2
  │   │ ├─┬ are-we-there-yet@1.1.2
  │   │ │ └── delegates@1.0.0
  │   │ ├── console-control-strings@1.1.0
  │   │ ├─┬ gauge@2.7.3
  │   │ │ ├── aproba@1.1.1
  │   │ │ ├── has-unicode@2.0.1
  │   │ │ ├── object-assign@4.1.1
  │   │ │ ├── signal-exit@3.0.2
  │   │ │ ├─┬ string-width@1.0.2
  │   │ │ │ ├── code-point-at@1.1.0
  │   │ │ │ └─┬ is-fullwidth-code-point@1.0.0
  │   │ │ │   └── number-is-nan@1.0.1
  │   │ │ ├─┬ strip-ansi@3.0.1
  │   │ │ │ └── ansi-regex@2.1.1
  │   │ │ └── wide-align@1.1.0
  │   │ └── set-blocking@2.0.0
  │   ├─┬ rc@1.1.7
  │   │ ├── deep-extend@0.4.1
  │   │ ├── ini@1.3.4
  │   │ ├── minimist@1.2.0
  │   │ └── strip-json-comments@2.0.1
  │   ├─┬ rimraf@2.5.4
  │   │ └─┬ glob@7.1.1
  │   │   ├── fs.realpath@1.0.0
  │   │   ├── inflight@1.0.6
  │   │   ├─┬ minimatch@3.0.3
  │   │   │ └─┬ brace-expansion@1.1.7
  │   │   │   ├── balanced-match@0.4.2
  │   │   │   └── concat-map@0.0.1
  │   │   └── path-is-absolute@1.0.1
  │   ├─┬ tar@2.2.1
  │   │ ├── block-stream@0.0.9
  │   │ └── fstream@1.0.11
  │   └─┬ tar-pack@3.3.0
  │     ├── fstream-ignore@1.0.5
  │     ├── once@1.3.3
  │     ├─┬ readable-stream@2.1.5
  │     │ └── string_decoder@0.10.31
  │     └── uid-number@0.0.6
  ├── bcryptjs@2.4.0
  ├─┬ body-parser@1.15.2
  │ ├── bytes@2.4.0
  │ ├── content-type@1.0.2
  │ ├─┬ debug@2.2.0
  │ │ └── ms@0.7.1
  │ ├── depd@1.1.0
  │ ├─┬ http-errors@1.5.1
  │ │ ├── setprototypeof@1.0.2
  │ │ └── statuses@1.3.1
  │ ├── iconv-lite@0.4.13
  │ ├─┬ on-finished@2.3.0
  │ │ └── ee-first@1.1.1
  │ ├── qs@6.2.0
  │ ├── raw-body@2.1.7
  │ └─┬ type-is@1.6.15
  │   └─┬ mime-types@2.1.15
  │     └── mime-db@1.27.0
  ├─┬ cheerio@0.22.0
  │ ├─┬ css-select@1.2.0
  │ │ ├── boolbase@1.0.0
  │ │ ├── css-what@2.1.0
  │ │ ├── domutils@1.5.1
  │ │ └── nth-check@1.0.1
  │ ├─┬ dom-serializer@0.1.0
  │ │ └── domelementtype@1.1.3
  │ ├── entities@1.1.1
  │ ├─┬ htmlparser2@3.9.2
  │ │ ├── domelementtype@1.3.0
  │ │ └── domhandler@2.3.0
  │ ├── lodash.assignin@4.2.0
  │ ├── lodash.bind@4.2.1
  │ ├── lodash.defaults@4.2.0
  │ ├── lodash.filter@4.6.0
  │ ├── lodash.flatten@4.4.0
  │ ├── lodash.foreach@4.5.0
  │ ├── lodash.map@4.6.0
  │ ├── lodash.merge@4.6.0
  │ ├── lodash.pick@4.4.0
  │ ├── lodash.reduce@4.6.0
  │ ├── lodash.reject@4.6.0
  │ └── lodash.some@4.6.0
  ├── clone@2.1.0
  ├─┬ cookie-parser@1.4.3
  │ ├── cookie@0.3.1
  │ └── cookie-signature@1.0.6
  ├─┬ cors@2.8.1
  │ └── vary@1.1.1
  ├─┬ cron@1.2.1
  │ └─┬ moment-timezone@0.5.13
  │   └── moment@2.18.1
  ├─┬ express@4.14.0
  │ ├─┬ accepts@1.3.3
  │ │ └── negotiator@0.6.1
  │ ├── array-flatten@1.1.1
  │ ├── content-disposition@0.5.1
  │ ├── encodeurl@1.0.1
  │ ├── escape-html@1.0.3
  │ ├── etag@1.7.0
  │ ├── finalhandler@0.5.0
  │ ├── fresh@0.3.0
  │ ├── merge-descriptors@1.0.1
  │ ├── methods@1.1.2
  │ ├── parseurl@1.3.1
  │ ├── path-to-regexp@0.1.7
  │ ├─┬ proxy-addr@1.1.4
  │ │ ├── forwarded@0.1.0
  │ │ └── ipaddr.js@1.3.0
  │ ├── qs@6.2.0
  │ ├── range-parser@1.2.0
  │ ├─┬ send@0.14.1
  │ │ ├── destroy@1.0.4
  │ │ └── mime@1.3.4
  │ ├─┬ serve-static@1.11.2
  │ │ └─┬ send@0.14.2
  │ │   └── ms@0.7.2
  │ └── utils-merge@1.0.0
  ├─┬ follow-redirects@1.2.1
  │ └─┬ debug@2.6.3
  │   └── ms@0.7.2
  ├─┬ fs-extra@1.0.0
  │ ├── graceful-fs@4.1.11
  │ ├── jsonfile@2.4.0
  │ └── klaw@1.3.1
  ├─┬ fs.notify@0.0.4
  │ ├── async@0.1.22
  │ └── retry@0.6.1
  ├─┬ i18next@1.10.6
  │ ├─┬ cookies@0.7.0
  │ │ └── keygrip@1.0.1
  │ ├── i18next-client@1.10.3
  │ └── json5@0.2.0
  ├── is-utf8@0.2.1
  ├─┬ js-yaml@3.7.0
  │ ├─┬ argparse@1.0.9
  │ │ └── sprintf-js@1.0.3
  │ └── esprima@2.7.3
  ├── json-stringify-safe@5.0.1
  ├── jsonata@1.0.10
  ├── media-typer@0.3.0
  ├─┬ mqtt@2.2.1
  │ ├─┬ commist@1.0.0
  │ │ ├── leven@1.0.2
  │ │ └── minimist@1.2.0
  │ ├─┬ concat-stream@1.6.0
  │ │ └── typedarray@0.0.6
  │ ├─┬ end-of-stream@1.4.0
  │ │ └─┬ once@1.4.0
  │ │   └── wrappy@1.0.2
  │ ├─┬ help-me@1.1.0
  │ │ ├── callback-stream@1.1.0
  │ │ ├─┬ glob-stream@6.1.0
  │ │ │ ├─┬ glob-parent@3.1.0
  │ │ │ │ ├─┬ is-glob@3.1.0
  │ │ │ │ │ └── is-extglob@2.1.1
  │ │ │ │ └── path-dirname@1.0.2
  │ │ │ ├── is-negated-glob@1.0.0
  │ │ │ ├─┬ ordered-read-streams@1.0.0
  │ │ │ │ └── is-stream@1.1.0
  │ │ │ ├── pumpify@1.3.5
  │ │ │ ├── remove-trailing-separator@1.0.1
  │ │ │ ├─┬ to-absolute-glob@2.0.1
  │ │ │ │ ├─┬ extend-shallow@2.0.1
  │ │ │ │ │ └── is-extendable@0.1.1
  │ │ │ │ └─┬ is-absolute@0.2.6
  │ │ │ │   ├─┬ is-relative@0.2.1
  │ │ │ │   │ └─┬ is-unc-path@0.1.2
  │ │ │ │   │   └── unc-path-regex@0.1.2
  │ │ │ │   └── is-windows@0.2.0
  │ │ │ └─┬ unique-stream@2.2.1
  │ │ │   ├─┬ json-stable-stringify@1.0.1
  │ │ │   │ └── jsonify@0.0.0
  │ │ │   └── through2-filter@2.0.0
  │ │ └── through2@2.0.3
  │ ├── inherits@2.0.3
  │ ├── minimist@1.2.0
  │ ├─┬ mqtt-packet@5.3.0
  │ │ ├── bl@1.2.0
  │ │ ├── process-nextick-args@1.0.7
  │ │ └── safe-buffer@5.0.1
  │ ├── pump@1.0.2
  │ ├─┬ readable-stream@2.2.9
  │ │ ├── buffer-shims@1.0.0
  │ │ ├── core-util-is@1.0.2
  │ │ ├── isarray@1.0.0
  │ │ ├── string_decoder@1.0.0
  │ │ └── util-deprecate@1.0.2
  │ ├── reinterval@1.1.0
  │ ├── split2@2.1.1
  │ ├─┬ websocket-stream@3.3.3
  │ │ └─┬ duplexify@3.5.0
  │ │   ├─┬ end-of-stream@1.0.0
  │ │   │ └── once@1.3.3
  │ │   └── stream-shift@1.0.0
  │ └── xtend@4.0.1
  ├── mustache@2.3.0
  ├─┬ node-red-node-email@0.1.22
  │ ├─┬ imap@0.8.19
  │ │ ├─┬ readable-stream@1.1.14
  │ │ │ ├── isarray@0.0.1
  │ │ │ └── string_decoder@0.10.31
  │ │ └── utf7@1.0.2
  │ ├─┬ mailparser@0.6.2
  │ │ ├── encoding@0.1.12
  │ │ ├─┬ mimelib@0.3.0
  │ │ │ └── addressparser@1.0.1
  │ │ └── uue@3.1.0
  │ ├─┬ nodemailer@1.11.0
  │ │ ├─┬ libmime@1.2.0
  │ │ │ ├── libbase64@0.1.0
  │ │ │ └── libqp@1.1.0
  │ │ ├─┬ mailcomposer@2.1.0
  │ │ │ └─┬ buildmail@2.0.0
  │ │ │   ├── addressparser@0.3.2
  │ │ │   └── needle@0.10.0
  │ │ ├── needle@0.11.0
  │ │ ├─┬ nodemailer-direct-transport@1.1.0
  │ │ │ └── smtp-connection@1.3.8
  │ │ └─┬ nodemailer-smtp-transport@1.1.0
  │ │   ├── clone@1.0.2
  │ │   └── nodemailer-wellknown@0.1.10
  │ └─┬ poplib@0.1.7
  │   └─┬ optimist@0.6.1
  │     └── wordwrap@0.0.3
  ├─┬ node-red-node-feedparser@0.1.7
  │ ├─┬ feedparser@1.1.3
  │ │ ├── addressparser@0.1.3
  │ │ ├── array-indexofobject@0.0.1
  │ │ └─┬ readable-stream@1.0.34
  │ │   ├── isarray@0.0.1
  │ │   └── string_decoder@0.10.31
  │ └─┬ request@2.74.0
  │   ├── aws-sign2@0.6.0
  │   ├── aws4@1.6.0
  │   ├─┬ bl@1.1.2
  │   │ └─┬ readable-stream@2.0.6
  │   │   └── string_decoder@0.10.31
  │   ├── caseless@0.11.0
  │   ├─┬ combined-stream@1.0.5
  │   │ └── delayed-stream@1.0.0
  │   ├── extend@3.0.0
  │   ├── forever-agent@0.6.1
  │   ├─┬ form-data@1.0.1
  │   │ └── async@2.3.0
  │   ├─┬ har-validator@2.0.6
  │   │ ├─┬ chalk@1.1.3
  │   │ │ ├── ansi-styles@2.2.1
  │   │ │ ├── escape-string-regexp@1.0.5
  │   │ │ ├── has-ansi@2.0.0
  │   │ │ └── supports-color@2.0.0
  │   │ ├─┬ commander@2.9.0
  │   │ │ └── graceful-readlink@1.0.1
  │   │ ├─┬ is-my-json-valid@2.16.0
  │   │ │ ├── generate-function@2.0.0
  │   │ │ ├─┬ generate-object-property@1.2.0
  │   │ │ │ └── is-property@1.0.2
  │   │ │ └── jsonpointer@4.0.1
  │   │ └─┬ pinkie-promise@2.0.1
  │   │   └── pinkie@2.0.4
  │   ├─┬ hawk@3.1.3
  │   │ ├── boom@2.10.1
  │   │ ├── cryptiles@2.0.5
  │   │ ├── hoek@2.16.3
  │   │ └── sntp@1.0.9
  │   ├─┬ http-signature@1.1.1
  │   │ ├── assert-plus@0.2.0
  │   │ ├─┬ jsprim@1.4.0
  │   │ │ ├── assert-plus@1.0.0
  │   │ │ ├── extsprintf@1.0.2
  │   │ │ ├── json-schema@0.2.3
  │   │ │ └── verror@1.3.6
  │   │ └─┬ sshpk@1.13.0
  │   │   ├── asn1@0.2.3
  │   │   ├── assert-plus@1.0.0
  │   │   ├── bcrypt-pbkdf@1.0.1
  │   │   ├─┬ dashdash@1.14.1
  │   │   │ └── assert-plus@1.0.0
  │   │   ├── ecc-jsbn@0.1.1
  │   │   ├─┬ getpass@0.1.6
  │   │   │ └── assert-plus@1.0.0
  │   │   ├── jodid25519@1.0.2
  │   │   ├── jsbn@0.1.1
  │   │   └── tweetnacl@0.14.5
  │   ├── is-typedarray@1.0.0
  │   ├── isstream@0.1.2
  │   ├── node-uuid@1.4.8
  │   ├── oauth-sign@0.8.2
  │   ├── qs@6.2.3
  │   ├── stringstream@0.0.5
  │   ├─┬ tough-cookie@2.3.2
  │   │ └── punycode@1.4.1
  │   └── tunnel-agent@0.4.3
  ├── node-red-node-rbe@0.1.8
  ├─┬ node-red-node-twitter@0.1.10
  │ ├── oauth@0.9.14
  │ ├─┬ request@2.81.0
  │ │ ├── caseless@0.12.0
  │ │ ├─┬ form-data@2.1.4
  │ │ │ └── asynckit@0.4.0
  │ │ ├─┬ har-validator@4.2.1
  │ │ │ ├─┬ ajv@4.11.7
  │ │ │ │ └── co@4.6.0
  │ │ │ └── har-schema@1.0.5
  │ │ ├── performance-now@0.2.0
  │ │ ├── qs@6.4.0
  │ │ ├── tunnel-agent@0.6.0
  │ │ └── uuid@3.0.1
  │ └── twitter-ng@0.6.2
  ├─┬ nopt@3.0.6
  │ └── abbrev@1.1.0
  ├─┬ oauth2orize@1.7.0
  │ └── uid2@0.0.3
  ├── on-headers@1.0.1
  ├─┬ passport@0.3.2
  │ ├── passport-strategy@1.0.0
  │ └── pause@0.0.1
  ├── passport-http-bearer@1.0.1
  ├── passport-oauth2-client-password@0.1.2
  ├─┬ raw-body@2.2.0
  │ ├── iconv-lite@0.4.15
  │ └── unpipe@1.0.0
  ├── semver@5.3.0
  ├── sentiment@2.1.0
  ├─┬ uglify-js@2.7.5
  │ ├── async@0.2.10
  │ ├── source-map@0.5.6
  │ ├── uglify-to-browserify@1.0.2
  │ └─┬ yargs@3.10.0
  │   ├── camelcase@1.2.1
  │   ├─┬ cliui@2.1.0
  │   │ ├─┬ center-align@0.1.3
  │   │ │ ├─┬ align-text@0.1.4
  │   │ │ │ ├─┬ kind-of@3.1.0
  │   │ │ │ │ └── is-buffer@1.1.5
  │   │ │ │ ├── longest@1.0.1
  │   │ │ │ └── repeat-string@1.6.1
  │   │ │ └── lazy-cache@1.0.4
  │   │ ├── right-align@0.1.3
  │   │ └── wordwrap@0.0.2
  │   ├── decamelize@1.2.0
  │   └── window-size@0.1.0
  ├── when@3.7.7
  ├─┬ ws@1.1.1
  │ ├── options@0.0.6
  │ └── ultron@1.0.2
  └─┬ xml2js@0.4.17
    ├── sax@0.6.1
    └─┬ xmlbuilder@4.2.1
      └── lodash@4.17.4