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

この記事は [Node-RED Advent Calendar 2019](https://qiita.com/advent-calendar/2019/node-red) 6日目の記事です。。

本記事では、[Node-RED Desktop](https://sakazuki.github.io/node-red-desktop/ja/) Ver.1.0 に追加された**オールデバッグ機能**を、
Node-RED Desktop以外でも使う方法を説明します。

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

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

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

## オールデバッグ機能とは
**debugノードを置かずに、debugができる**機能です。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133603/273ef0a8-bf2d-45b1-8860-08aac494ecd7.png)

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

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

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

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

０．node-redをインストール

```shell-session
$ mkdir sagyou
$ cd sagyou
$ npm install node-red
```

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

```shell-session
$ cp node_modules/node-red/red.js node_modules/node-red/red2.js
$ vi node_modules/node-red/red2.js
```

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

```diff
$ 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);
$
```

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

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

```shell-session
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133603/7c39494e-7741-89d7-154f-e31f5a3f0447.png)

また、昨年のアドベントカレンダーで紹介された[**縦フロー**](https://qiita.com/sakazuki/items/a141f63112cd9374eadb)が使えたり、ngrokやnode-generatorが統合されていたりと便利なツールに仕上がっていると思います。

興味を持たれた方は、是非インストールして試してみてください。
ダウンロードは[こちらから](https://sakazuki.github.io/node-red-desktop/ja/)できます

https://sakazuki.github.io/node-red-desktop/ja/

## Appendix
- [Node-RED Desktop](https://sakazuki.github.io/node-red-desktop/ja/)
- Node-RED UG勉強会 2019 年末LTパーティ 発表資料： [Node-RED Desktop Ver. 1.0 新機能紹介](https://www.slideshare.net/kazukisaito127/nodered-desktop-ver-10)