OpenAPIドキュメント(Swagger)からNode-REDのノードをつくる手順

　こんにちは、(株)日立製作所 研究開発グループ サービスコンピューティング研究部の横井一仁です。

　本ドキュメントでは、ノード開発容易化ツール[「Node generator」](https://github.com/node-red/node-red-nodegen/wiki/Japanese)の使い方をご紹介します。

# Node generatorとは

　Node generatorとは、Node-REDのオリジナルノードを自動生成するコマンドラインツールです。

　Swagger Codegenの様に[OpenAPIドキュメント(Swagger)](https://qiita.com/disc99/items/37228f5d687ad2969aa2)からノードのソースコードを生成したり、JavaScriptコードを書いたfunctionノードを共有可能なオリジナルノードに変換したりできます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/c8dcc5ed-730e-364e-29a3-7ca95c66bdb9.png' width='335px' height='300px'>

　[日立が開発し、OSS化した](https://businessnetwork.jp/tabid/65/artid/5598/page/1/Default.aspx)本ツールは、現在[OpenJS Foundation (Linux Foundation)](https://openjsf.org)管理下のNode-RED公式のサブプロジェクトとなっており、開発コミュニティと協力して機能拡張が行われているOSSになっています。

　本ツールは下記サイトで紹介されている様に、CiscoやIBMなどのNode-RED活用企業でも活用されています。

- Ciscoでの活用例: https://developer.cisco.com/meraki/meraki-dashboard-api-node-red-node/
- IBM USでの活用例: https://developer.ibm.com/tutorials/use-node-red-node-generator-to-create-new-nodes-from-apis-and-services/

# OpenAPIドキュメントとは

　OpenAPIドキュメントとは、REST APIの仕様を記載するための業界標準のフォーマットです。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/5f1ccda2-8562-cdbb-080d-60b48f6121ae.png' width='652px' height='400px'>

　OpenAPIドキュメントには、上の例の様にYAMLやJSONの形式で、サービスのREST APIの説明や、どの様にアクセスすれば良いかが記載されています。

# OpenAPIドキュメントからノードを生成

　それでは早速OpenAPIドキュメントからNode-REDのノードの作成してみます。今回は、[宇宙ステーションの位置情報を取得するAPI](http://open-notify.org/Open-Notify-API/ISS-Location-Now/)のOpenAPIドキュメントを利用しました。

　本ドキュメントで用いた動作環境は、Node-REDをインストール済のWindows環境です。本ツールはmacOSやLinuxにも対応していますので、その場合は適宜ファイルパス等を変更して試してみてください。

## (1) Node generatorをインストール

　管理者モードでコマンドプロンプトを起動し、ビルドツール(Windowsの場合のみ)とNode generatorをインストール

```shell
npm install -g node-red-nodegen
npm install -g windows-build-tools    （Windowsの場合のみ）
```

## (2) 管理者モードのコマンドプロンプトを閉じる

## (3) OpenAPIドキュメントをダウンロード

https://raw.githubusercontent.com/kazuhitoyokoi/nodegen-handson/master/swagger.yaml からOpenAPIドキュメントをダウンロードし、ホームディレクトリ(例えばC:¥Users¥<ユーザ名>)に保存します。

---

## (4) コマンドプロンプトを開き、ホームディレクトリへ移動

　ユーザモードでコマンドプロンプトを開き直し、cdコマンドを実行してホームディレクトリに移動します。

```shell
cd
```

## (5) OpenAPIドキュメントからノードを生成

　Node generatorを用いてOpenAPIドキュメントからノードを生成します。

```shell
node-red-nodegen swagger.yaml
```

　以上の操作でノードの作成ができました。ホームディレクトリにnode-red-contrib-iss-locationというディレクトリが生成されているため、エクスプローラーで中身を見てみます。以下の様に、ノードを構成するファイル群が生成されているはずです。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/c643cf7a-2e84-f781-538b-d90f419891e7.png' width='699px' height='400px'>

　次にこのノードをNode-REDから呼び出せるように設定してみます。

## (6) 生成されたディレクトリに移動

```shell
cd node-red-contrib-iss-location
```

## (7) 依存モジュールのインストール、シンボリック作成の準備

```shell
npm link
```

## (8) Node-REDのホームディレクトリに移動

```shell
cd
cd .node-red
```

## (9) シンボリックリンク作成

```shell
npm link node-red-contrib-iss-location
```

## (10) Node-REDを起動

　node-redコマンドでNode-REDを起動します。もし起動中の場合はCtrl+cで終了し、再度起動してください。

```shell
node-red
```

　上手くいけば、Node-REDフローエディタ( http://\<Node-REDのIPアドレス\>:\<ポート番号\> )の左側のパレットに緑色のノードが登場しているはずです。

![generatednode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/60f22c98-bae7-0bee-b1af-30ddf8aa9746.png)

　本ノードをワークスペースに配置し、ノードプロパティを設定してみます。OpenAPIドキュメントに記載されているエンドポイントがプルダウンメニューで選択できるようになっていますね。

　次に前後にinjectノードとdebugノードをつなぎ、実行してみます。injectノードのボタンをクリックすると、デバッグタブに宇宙ステーションの現在の緯度経度(latitude、longitude)が表示されました。

![issflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/e16b3194-32ce-3af4-4169-e34218a34455.png)

# 最後に

　Node generatorを用いることで、OpenAPIドキュメントが公開されているサービスは、少ない工数でサービスに対応したNode-REDのノードを開発できるようになります。

　Node-REDの使い方については、詳細の日本語ドキュメントも公開していますので、ぜひ見てみてください。

- Node generatorのドキュメント: https://github.com/node-red/node-red-nodegen/wiki/Japanese

　今回作成したノードを用いたフローの開発例は、[次の記事](https://qiita.com/kazuhitoyokoi/items/0d195396ab7e3e646815)でご紹介する予定です。