node-red
Node-REDDay 17

Node-REDで超初心者が躓いたポイントとその回避方法

More than 3 years have passed since last update.


はじめに


超初心者の定義

この一連の記事における超初心者を以下に定義します。


Webプログラミングの経験が0の状態からNode-REDを使用した人



関係するノード

本記事は、超初心者がNode-REDでnodered.orgの更新情報をSlackに通知するアプリを作ったの記事中での試行錯誤に基づいた記事です。主にmomentノードを使う際に躓いたポイントについての記述になります。


躓きポイントとその回避法


1. JSONからキーを使って取得した文字列がmomentノードに認識されない

FireShot Capture 1 - Node-RED - http___localhost_1880_.png

上のFlowを実行すると、momentノード(Date/Time Formatter)の部分で警告が出ます。

Node-RED 2015-12-17 18-12-12.png

last_updatedというFileが怪しいので、Debugノードを入れて調べると、

Node-RED 2015-12-17 18-10-43.png

last_updatedから出てきたmsg.payloadはこの形。

Node-RED 2015-12-17 18-12-32.png

次に、Fileへの収納部分を調べてみます。

Node-RED 2015-12-17 18-15-51.png

changeノードから出ているのは配列であることがわかります。

Node-RED 2015-12-17 18-16-16.png

ここで一つの強引な解決策として、


無理やりStringに変える


toString

msg.payload = String(msg.payload);

return msg;


を選び、最終的にこの形にして動かし解決。

Node-RED 2015-12-17 18-22-49.png


2. JSONのキーの階層をmomentノードで指定できない

JSONをsplitterノードで記事ごとに分けた後、記事の構造を見てみると、

Node-RED 2015-12-17 18-33-38.png

{

"id": ["tag:github.com,2008:Grit::Commit/efacef8899f713a2ecf297a78e48681131a4ec37"],
"link": [{
"$": {
"type": "text/html",
"rel": "alternate",
"href": "https://github.com/node-red/node-red.github.io/commit/efacef8899f713a2ecf297a78e48681131a4ec37"
}
}],
"title": ["\n Updated page footer\n "],
"updated": ["2015-11-28T23:05:43Z"],
"media:thumbnail": [{
"$": {
"height": "30",
"width": "30",
"url": "https://avatars3.githubusercontent.com/u/51083?v=3&s=30"
}
}],
"author": [{
"name": ["knolleary"],
"uri": ["https://github.com/knolleary"]
}],
"content": [{
"_": "\n <pre style='white-space:pre-wrap;width:81ex'>Updated page footer</pre>\n ",
"$": {
"type": "html"
}
}]
}

となっていました。ここで私はupdatedの値


2015-11-28T23:05:43Z


を取得し、momentノードに入れたかったので、以下のようにflowを作成しました。

Node-RED 2015-12-17 18-51-27.png

念のため値をStringにキャスト。


toString

msg.payload.updated = String(msg.payload.updated)

return msg;

momentノード(Date/Time Formatter)の中身はこうしました。

Node-RED 2015-12-17 19-07-21.png

しかしここでこんな警告が。

Node-RED 2015-12-17 18-59-37.png

payload.updatedが見つからない、でもDebugにはpayload.updatedの値が出ている状態。これはmomentノードが、プロパティの階層を追えないことで起こる警告であることが、周りの助言から発覚。

functionノードを書き換え、msg.updatedに日付を入れます。


toString+set_to_updated

msg.updated = String(msg.payload.updated);

return msg;

Date/Time Formatterの中身はこう変更。

Node-RED 2015-12-17 19-09-51.png

これで、無事に動くようになりました。


最後に

とても便利なmomentノード、私のように躓いた初心者でもとりあえずの回避ができるように、この記事を書きました。配列からの変換はもっとスマートな方法があると思うのでお分かりの方は是非教えて下さい。よろしくお願いします。