カラクリスタ

「輝かしい青春」なんて失かった人のブログ

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

便利グッズ

これは何か?

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

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

僕は最近、

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

aglex

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

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

Express.js

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

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

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

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

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

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

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

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

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

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

になります。

使い方

基本的な使い方は、

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

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);

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

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

以上

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

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


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