読者です 読者をやめる 読者になる 読者になる

カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

node.js で http server を起動せずに http access をシミュレートする便利グッズを作った

Development Software

便利グッズ

npm:

www.npmjs.com

github:

github.com

これは何か?

@nyarla/http-simulator は、 node.js で HTTP Server を起動せず に、 Web Application (express 等) への HTTP アクセスの再現をする ために作られたモジュールです。

このモジュールを作った理由

僕は最近、

  • AWS Lambda + AWS API Gateway

へデプロイする前提で何かを作り始める事が多いのですが、 その際に使用する AWS Lambda + AWS API Gateway での開発の足回りに、

www.npmjs.com

と言うフレームワークを使っています。

それでこの aglex と言うフレームワークは、ローカルでの開発に、

を使えて、かつ、AWS Lambda + AWS API Gateway へのデプロイの面倒も見てくれる、という、 薄いラッパーみたいなフレームワークで、自分にとっては、ようやくながら見つける事が出来た、 自分に対して大変に性に合うフレームワークなのですが、使う上でまったく無問題か、と言うとそうでも無くて、

AWS API Gateway から AWS Lambda で受け取った JSON を、 node.js の http.IncomingMessage に変換する部分が弱い

という欠点が有ったりします。

が、もっともこの欠点は、デフォルトで生成されるテンプレコードに起因する問題であり、 それ以上のことは自分で補ってやれば問題ない、という感じだったので、 AWS Lambda + API Gateway で何かを作り始める際には、その辺りの、

  • AWS API Gateway から JSON を受けとって HTTP Request を組み立てる

というコードを書いていました。

が、しかしながら、しばらくこの辺りを書いていて、 AWS Lambda + AWS API Gateway を書くたびに、 この辺りのコードを書くのは流石に面倒になってきて、かつ

あ、なんかこれモジュールとして切り出せば便利なんじゃね?

とか思ったので、とりあえず、

  • プレーンな Javascript Object から http.IncomingMessagehttp.ServerResponse を組み立てる

という部分のコードを切り出して、モジュールとしての体裁を整えて、と言う事を行なったのが、

www.npmjs.com

になります。

使い方

基本的な使い方は、

に、一応は全部書いたので、詳しい内容はそちらを見た方が早いと思いますが、 大体の使い方のイメージは下記の様な感じです:

const express = require('express');
const http    = require('@nyarla/http-simulator');

const app     = express();

[...]

const done    = function (err, ret) { [...] }
const fn      = http.createSimulator(app);

fn({ method: 'GET' }, done);

それで、このモジュールでは、特に使い方の注意点とかは無いんですが、もし細かい挙動で不明な点が有れば、

github.com

で、実際のコード (index.js) や テスト (test.js) を見た方が、実際の挙動とかがつかみ易いのではないか、と思います。

以上

ま、話としては以上ですが、もし上記モジュールについて、何か問題などありましたら、 GitHub で Issue を立ててもらえれば、対応出来る範囲で対応したい、と考えています。

あとはまあ、このモジュールはどちらかというと node.js の http.IncomingMessage のモックを作る、 と言うよりかは、 node.js の http.IncomingMessage をそのまま使い、 Web Application への HTTP Request を再現する、 という事に主眼を置いたモジュールなので、ユースケースが結構限定されるかとは思うんですが、テスト用途とか、 あるいは今回の最初の切っ掛けみたく、 node.js だけどサーバは立てられない AWS Lmabda 内で HTTP Request を再現したい、 みたいな、限られた用途でなら、それなりに使えるのではないか、と思ってます。


という事で本日の朝っぱらからの記事は以上です。はい。