目的

Node-REDではHTTPで要求を受け、HTTPを出力する事が出来る。 これを使ってRDBに対してCRUD(Create, Read, Update, Delete)出来るWeb APIを作ってみる。


全件取得 Read

一番簡単な全件表示

最初にGets AllではアクセスするURLを指定する。 例えば/API/1/mytableとするなら

次にReadでSQLを書く

HTTPで返す前に他のサイトからアクセス出来るようにHeadersでHeaderを追加する

1
2
3
4
5
6
msg.headers = {
 "Access-Control-Allow-Origin":"*",
 "Access-Control-Allow-Method":"GET,POST,PUT,DELETE,OPTIONS",
 "Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept"
}
return msg;

1件取得 Read

IDを受けて対応するレコードを返す。

最初にGetでアクセスするID付きURLを指定する。 例えば/API/1/mytable/idとするなら

次にidを切り出す。(行6-8) ついでにHeaderを追加する。(行1-5)
8行目で1を掛けて文字列を念のために数字に変換している。

1
2
3
4
5
6
7
8
9
msg.headers = {
 "Access-Control-Allow-Origin":"*",
 "Access-Control-Allow-Method":"GET,POST,PUT,DELETE,OPTIONS",
 "Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept"
}
var url = msg.req.url;
var msgs = url.split("/");
msg.payload.ID=1*msgs[msgs.length-1];
return msg;

切り出したidを使って抽出する


追加 Create

データを受けてRBDに入れるだけ。

最初にPostでアクセスするURLを指定する。 例えば/API/1/mytableとか。

HeadersはGetと同じなので省略。


変更 Update

IDを受けて対応するレコードを変更する。

最初にPutでアクセスするURLを指定する。 1件取得からMethodをPUTに変えるだけ。

IDは1件取得の時と全く同じ。 PUTされたデータはmsg.payloadに入って来るのでidだけを追加する。

Updateでは3つの引数をSQLに渡す。 この時は「,」で区切って渡す。


削除 Delete

IDを受けて対応するレコードを削除する。

最初にDeleteでアクセスするURLを指定する。 1件取得からMethodをDELETEに変えるだけ。

IDは1件取得の時と全く同じ。

idをSQLに渡して削除する。


まとめ

これはコードを書かずにAPIを作れるか!と思って一通り作ってみましたが色々と課題があります。

  1. Node-REDでエラーが起きてもHTTPには届かないのでタイムアウトを待つしかない。
  2. エラーが起きたらこっちの処理に移るような分岐が出来ない。
  3. エラーが起きた時のログが貧弱でほとんど何も分からない。 例えばテーブス名を間違えてもNode-REDのログには出ない。 Nodeのログを見るしかない。

フレームワークは制限がある分、楽が出来るのですがちょっと制限が多いのでIoT向けだけと考えた方が良さそうです。

[2015.11.09追記] Catch nodeを使うとエラーハンドリング出来ると教えて頂きました。 これについては別途書くつもりです。