[enebular][Node-RED][Salesforce][box][S3] Node-REDでSalesforceデータをCSV化してboxとS3へ保存
前回に引き続きNode-REDネタです。
(やっと)force.comからデータを出し入れするNode(Node-REDでは配置するモジュールのことをNodeと呼びます)を作成したので、SalesforceのデータをCSV化してboxとS3に保存してみます。
まず、force.com Nodeの概要を説明します。以下の画像のようにNodeが並ぶ左ペインからforce.com NodeをドラッグしてWorkspace(中央ペイン)へ配置します。
次に配置したforce.com NodeをダブルクリックするとNodeの詳細設定をするモーダルウィンドウが開きます。
画像では既にアカウントが登録されてますが新規登録する場合はペンアイコンのボタンをクリックすることで可能です(現在はforce.com Nodeをオープンソース化するためにID, Passwordでの認証としています)
「Operation」という項目名で何となく想像つくと思いますが、query/create/update/upsert/deleteから登録したアカウントの組織のオブジェクトに対して行いたい操作を選択できます。
今回はとりあえずqueryを選びます。
次に実際のクエリを書くのですが、実際にシステムで利用する場合はクエリを動的に生成したいケースが考えられるため、Node-RED特有のメッセージストリームでforce.com NodeへSOQL文字列を送ります。
最も基本的な方法はInject Nodeを使ってメッセージを送る方法です。以下のようにInject Nodeを配置してPayloadにSOQLを書きます(例では取引先/Accountのデータを取得するクエリ)
あとはforce.com Nodeの結果を見るためのDebug Nodeを配置して3つのNodeを接続し(コネクト部分からドラッグすると線が出現してビジュアル的につながって見えます)Deployボタンを押してデプロイします。
さあ、実行してみましょう。Inject Nodeのボタンを押すと実行できます。実行すると以下のようにforce.comから取引先/Accountデータを取得した結果のJSONが右ペインのデバッグ欄に表示されます。
ただ、この例で結果として欲しいのはレコードのみなのでレコード以外のデータ(レコード数など)はJSONから除外します。除外するにはChange NodeというNodeを使います。
Change Nodeは流れるストリームデータに変更を加えるNodeです。簡単な変換であればこのNodeで可能ですし、このNodeで実現できないものはFunction Nodeというプログラム自体を書けるNode(言語はJavascript)もあります。
では、Change Nodeを以下のように設定しましょう。
解説するとNode-REDを流れるストリームデータの実体はmsgというオブジェクトで、その中でもpayloadというプロパティがメッセージそのものになります。
先ほどのforce.comから取得した取引先/Accountデータの場合、クエリ結果そのものはmsg.payloadに入っていて、レコードだけを抜き取りたい場合はtoをmsg.payload.recordsとすれば抜き取れるわけです。
以下が実際にレコードのみ抜き取ってデバッグした画像です。レコード数など余計なデータは消えましたね。
次は取得したレコードデータをCSV化します。その名もCSV Nodeというものがありますので、これを配置して以下のように設定することでJSONのKeyをヘッダにしたCSVが生成できます。
実行したら以下のような感じ。ちょっと見難いですがCSV化されてます。
あとはboxとS3のNodeにつなげるとファイルとして保存されます。
以下がbox Nodeの設定。
以下がS3 Nodeの設定。
結局、以下のようなflowになります。
実行してS3を見てみるとファイルが作成されてます。
boxにもファイルが作成されています。
boxのプレビューでファイルを見てみるとこんな感じ。