Adobe XDプラグイン機能によるfetchで外部サーバーのNode-REDにやりとりするメモ

Adobe XDプラグイン機能によるfetchで外部サーバーのNode-REDにやりとりするメモです。

やりたいこと

Adobe XDでプラグイン機能から外部ネットワークアクセス(Network API)を試してみましたが、とても可能性を感じました。

image

ここからもちろんプラグイン内のJavaScriptだけでも色々できますが、外部サーバーでデータの調整や連携すると、より拡張できて面白くなりそうなので試していきます。

外部サーバーはNode-REDにまかせてみる

image

外部サーバーは、HerokuにNode.jsを置いたり、はたまたレンタルサーバーで何かしらプログラムを書いたりと色々なやり方が考えられますが、今回は普段からよく使っている視覚的にデータの流れが作れるNode-REDとの連携を試しておきます。

image

たとえばこのサーバーの /sample のURLで受信したものを、そのままオウム返しのようにデータを返すものです。

このように目で見て動きが残せると、いろいろメリットがあり、あとあと「この処理良くしたいな」とか「あの処理どういう風に動いてたっけ」と思い出しやすくなりますし、すぐデータの流れが分かるので作りやすいです。

もちろん、複雑な構造でプログラムを書くとなったらNode.jsでエディタを用意して書きますが、Node-REDでもかなりの仕組みが構築できるので、試行錯誤をしていく時に重宝しています。

プラグインを用意する

前回の記事をベースにプラグインを作ります。

manifest.json

manifest.json はこのように書いています。

{
    "id": "NODE_RED_QUICK_START",
    "name": "Node-RED Hello World sample plugin",
    "host": {
        "app": "XD",
        "minVersion": "13.0.0"
    },
    "version": "1.0.0",
    "uiEntryPoints": [
        {
            "type": "menu",
            "label": "say Node-RED Hello!",
            "commandId": "helloCommand"
        }
    ]
}

今回に合わせて名前などを丁寧に書いています。

main.js

main.jsはこのように作りました。

const {Text, Color} = require("scenegraph"); // XD拡張APIのクラスをインポート
 
function helloHandlerFunction(selection) { // メインのファンクション
  console.log("my function is called!"); // Developer Consoleに出力
   
  // Adobe XDがNode-REDの該当URLにアクセスする
  const url = "http://<my-web-server-url>/adobexd";
  // データを作る
  const initData = {
      method:"POST",
      headers: {
        "Content-Type": "application/json; charset=utf-8"
      },
      body:JSON.stringify(
          {
              message:"Hello Node-RED!!!"
          }
      )
  };
  // fetchでデータ取得
  return fetch(url,initData)
      .then(function (response) {
        return response.text();
      })
      .then(function (textResponse) {
 
        const el = new Text(); // XDのTextクラスからインスタンスを生成
        el.text = textResponse;  // 受信結果 textResponse
        el.styleRanges = [ // テキストのスタイルを設定
          {
            length: el.text.length,
            fill: new Color("#FF0000"),
            fontSize: 24
          }
        ];
        selection.insertionParent.addChild(el); // XDノードツリーにテキストオブジェクトを追加
        el.moveInParentCoordinates(100, 100); // テキストオブジェクトの表示位置を指定
 
        return console.log(textResponse);
      });
}
 
module.exports = { // コマンドIDとファンクションの紐付け
  commands: {
    helloCommand: helloHandlerFunction
  }
};

Adobe XDがNode-REDの該当URLにデータを送り、オウム返しで返ってきたデータを配置するようにしています。

"http://<my-web-server-url>/adobexd"<my-web-server-url> は今回設定するNode-REDのサーバーのURLです。

このあたりは前回の記事で確認しているので安心して実装できます。

Node-REDのオウム返しする仕組み

つづいてNode-REDです。冒頭に紹介したオウム返しするものを発展させていきます。

image

Adobe XDからデータが来たらそのまま返答します。今回はあくまでテストなのでこれでOKです。

image

Node-REDで作った仕組みはこちらです。

image

このサーバーの /adobexd というURLにAdobe XDからデータが来たらオウム返しで返答します。

debugノードでデータを見えるようにしている

image

このノードはdebugノードと言ってAdobe XDに送られているデータをデバッグタブに表示しています。

image

データを受信すると右側のデバッグタブにもらった情報が表示されます。

こちらをデプロイして準備完了です。

今回のJSONデータ

今回のNode-REDの仕組みは以下のとおりです。Node-REDでインポートして使ってください。

[{"id":"f4bed7ed.2ac638","type":"http in","z":"ec317ab5.cf3f58","name":"","url":"/adobexd","method":"post","upload":false,"swaggerDoc":"","x":500,"y":100,"wires":[["a507f4ca.8beda8","42d77156.ad82d"]]},{"id":"a507f4ca.8beda8","type":"debug","z":"ec317ab5.cf3f58","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":710,"y":160,"wires":[]},{"id":"42d77156.ad82d","type":"http response","z":"ec317ab5.cf3f58","name":"","statusCode":"","headers":{},"x":690,"y":100,"wires":[]},{"id":"fa33b1ca.6edf2","type":"comment","z":"ec317ab5.cf3f58","name":"request data debug","info":"","x":730,"y":200,"wires":[]}]

動かしてみる

早速動かしてみます。

image

実行するとオウム返しされた返答がテキスト配置されました!

image

Adobe XDを上部に置き、Node-REDを下部に置いた流れはこちらです。Node-RED側でもAdobe XDデータを拾えていますね。

これができると、Adobe XDを外部サーバーをうまく役割分担して、いろいろなデータの流れを取り込めそうです!いろいろと試していきます!

それではよき Adobe XD & Node-RED Life を!