LoginSignup
11
4

More than 3 years have passed since last update.

debugノードを置かずにフローをdebugする方法

Last updated at Posted at 2019-12-05

この記事は Node-RED Advent Calendar 2019 6日目の記事です。。

本記事では、Node-RED Desktop Ver.1.0 に追加されたオールデバッグ機能を、
Node-RED Desktop以外でも使う方法を説明します。

前書き:標準デバッグ機能の課題

Node-REDでフローをデバッグするには、debugノードをフロー上に置く必要があります。
しかし、これには以下の課題があります。

  • 対象フローを直接改変する必要があり、意図せず元のフローを壊す恐れがある:cold_sweat:
  • debugノードが多くなってくると、フローのわかりやすさが損なわれてしまう:confounded:
    • レイアウト調整や、使用後の削除も面倒

オールデバッグ機能とは

debugノードを置かずに、debugができる機能です。

具体的には、
debugノードの有無に関わらず、
すべてのノードのoutを通るmsg(図の赤丸を通るmsg)がデバッグウィンドウに出力できるようになります。 :flushed:

image.png

これは、すべてのノードにdebugノードをぶら下げたのと同じ状態です。
つまり、オールデバッグ機能を使えば、もう個別にdebugノードを置かなくてよくなります。

機能の追加はたった22行で

Node-RED起動用ファイル(node_modules/node-red/red.js)に、22行を追加するだけです。(ver.1.0.3 で解説しています)

以下で、手順を説明します。

0.node-redをインストール

$ mkdir sagyou
$ cd sagyou
$ npm install node-red

1. red.js ファイルを red2.jsにコピーして、red2.jsを編集します

$ cp node_modules/node-red/red.js node_modules/node-red/red2.js
$ vi node_modules/node-red/red2.js

2. 差分が以下となるように編集します。

$ diff -c node_modules/node-red/red*.js
*** node_modules/node-red/red.js       2019-11-02 10:44:27.536891600 +0900
--- node_modules/node-red/red2.js      2019-12-01 09:37:25.653174800 +0900
***************
*** 24,29 ****
--- 24,30 ----
  var nopt = require("nopt");
  var path = require("path");
  var fs = require("fs-extra");
+ var Node = require('@node-red/runtime/lib/nodes/Node')
  var RED = require("./lib/red.js");

  var server;
***************
*** 198,205 ****
--- 199,228 ----
      settings.userDir = parsedArgs.userDir;
  }

+ function allDebugOut() {
+     Node.prototype._send = Node.prototype.send
+     Node.prototype.send = function(msg) {
+         Node.prototype._send.call(this, msg)
+         var _data = {
+             id: this.id,
+             z: this.z,
+             name: this.name,
+             topic: msg.topic,
+             msg: msg,
+             _path: msg._path
+         }
+         var data = RED.runtime.util.encodeObject(_data);
+         RED.runtime.events.emit("comms", {
+             topic: "debug",
+             data: data,
+             retain: false
+         })
+     }
+ }
+
  try {
      RED.init(server,settings);
+     allDebugOut();
  } catch(err) {
      if (err.code == "unsupported_version") {
          console.log("Unsupported version of Node.js:",process.version);
$

以上で、オールデバッグ機能 の追加は完了です。

3. オールデバッグ機能を使いたい時は、red.js ではなく red2.js を使ってNode-REDを起動します。

$ node node_modules/node-red/red2.js

これで、Nod-REDのすっきり・シンプル・わかりやすい フローを取り戻すことができますね!

それでは、楽しいNode-REDライフを!!:blush:

おわりに

Node-RED-Desktop Ver.1.0 では、このオールデバッグ機能がメニューのON/OFFで利用できます。

2019-11-27 20_32_24-Node-RED UG勉強会2019年末LT原稿 - Google ドキュメント.png

また、昨年のアドベントカレンダーで紹介された縦フローが使えたり、ngrokやnode-generatorが統合されていたりと便利なツールに仕上がっていると思います。

興味を持たれた方は、是非インストールして試してみてください。
ダウンロードはこちらからできます

Appendix

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4