Node-REDのhttpレスポンスをgzipで返す

gzip flow
Node-REDでapiを作って遊んでます。
httpリクエストの結果をgizpで圧縮して返すにはどうするのかな?と思い実験してみました。


Node-REDのhtttpレスポンスをgzipで返す事はできるのか?
中身はNode.jsだからできる気がします。ですが、Node-REDはUIでラップされているので具体的な方法がわかりません。

調べるとすぐに次の情報が見つかるでしょう。
Node-Red access to zlib | stackoverflow
asked Nov 2 '15 at 23:09 Brendan Murray
How can I compress a msg.payload to feed into an HTTP response node?
まずはsettings.jsでzlibを呼び出せるように設定します。
Find the functionGlobalContext section in the settings.js (usually found in the ~/.node-red) and edit it as follows:
functionGlobalContext: { zlib:require('zlib') }
ホームディレクトリ下の.node-redディレクトリにあるsettings.jsをテキストエディタで開きます。functionGlobalContextを検索して zlib:require('zlib')を追加します。
例えばこんな風にします。
    functionGlobalContext: {
        // os:require('os'),
        // octalbonescript:require('octalbonescript'),
        // jfive:require("johnny-five"),
        // j5board:require("johnny-five").Board({repl:false})
        zlib:require('zlib')
    },
settings.jsを修正したらNode-REDを再起動します。
 ArjanさんのコメントにあるようにzlibはNode.jsに含まれていますのでインストールする必要はありません。
これでfunctionノードで"context.global.zlib.gzip"とすれば呼び出せます。
そして、httpレスポンスの前のfunctionノードでこんな風に書いておきます。
var msg.headers = {};
//httpリクエストからgzipを受け取れるか確認する
if (msg.req.headers["accept-encoding"].match(/gzip/)) {
  //レスポンスヘッダーにgzipエンコードであると書く
  msg.headers["Content-Encoding"] = "gzip";
  //msg.payloadを非同期圧縮する
  context.global.zlib.gzip(JSON.stringify(msg.payload), function (err, buffer) {
    if (!err) {
      msg.payload = buffer;
      node.send(msg); //圧縮されたらflowを流す
    } else {
      /* handle error */
    }
  });
  return; //非同期なのでreturnのみ
}
試してみるとgzipで送れているようです。
私の場合たいしたデータを送るわけでもないので圧縮するだけ時間の無駄になりますけど。


コメント

最近のコメント

Threaded Recent Comments will be here.