やあ子供たち。
express.static()は便利な反面、実際には何をやってくれているのかがブラックボックスになっているとも言えるね。
例えばあるコンテンツページを表示した際に、pngを返した枚数だけカウントしたいだとか、jpegは禁止するだとか、動画は当然ストリーミングで返してくれてるよね、え?まさか全部メモリに読み込んだバッファを返してるの?何してくれちゃってるの?という具合に、単純にexpress.staticに任せきりにしたくない場合というのは多々あるはずだ。
そんなときは、「expressのミドルウェアは、記述した順番に実行される」ということを利用して、例えば「png」で終わるリクエストURLだけ捕まえてその中でやりたい処理をやり、そこでレスポンスを終わらせてしまえばいいだけのことさ。あるいはここで、pngきたよとかログに追記したり、そのpngに何かをして、返したり(何何?)、いろいろできるってわけ。
それをやってみた具体的なコードが以下だよ。
app.get("/*png",(req, res)=>{ console.log(req.url); console.log("i have captured png req before express.static does."); var path = __dirname + "/static_resources"+ req.url; console.log( path); fs.readFile(path, (err, data) => { if (err) { console.log("file read error"); // res.end(); }else{ console.log("hi, and im gonna write and send png for my own, not express.static"); res.writeHead(200, { "Content-Type": "image/png" }); res.end(data, 'binary'); } }); }); app.use(express.static("static_resources"));
気を付けなければいけないのは、コンテンツは、express.staticのベースパス(上記一番下の行で指定しているよ)の中に実際には配置されているわけなので、上記pngの処理の中で、ちゃんとこのベースパスも入れた正しいパスをfs.readFileには渡してあげなくちゃいけないよねってことさ。
じゃ今日はこの辺で。(expressを知らないNodeJSだけの国からやってきたおじさんの今日の気づきでした。)
チャオ!