超今さらExpress触ってみた - その2 Routerと実際のRequest Handlerを分けたい -
超今さらExpress触ってみた - その1 Expressって生々しすぎない? の続き。
今回は routing と実際の request を処理する function を分離します。
Request Handlerをroutingから独立させる
前回のコードの中のアプリの部分は
app.js
module.exports = (app) => {
app.get('/', (req, res) => {
res.send('Hello Express')
})
return app
}
このようによくある routing に closure をそのまま渡す形のまま終わっていますが、これを router.js, index.js に分けます。(なぜ handler.js じゃないかは次回明らかになります。)
app.js 改め router.js
const IndexHandler = require('./index')
module.exports = (app) => {
app.get('/', IndexHandler)
return app
}
request handler には function reference を与えておくと、引数は勝手にいい具合に渡ってきます。
index.js
module.exports = (req, res) => {
res.send('Hello Express')
}
ちなみに server.js はこんな感じ。
const express = require('express')
const morgan = require('morgan')
let app = express()
app.use(morgan('combined'))
app = require('./router')(app)
app.listen(3000, () => {
console.log('Starting server localhost:3000 ...')
})
app.js じゃなくて router.js を require してます、ってだけ。
これをやって何が嬉しいのか
Google Cloud Functions の HTTP Function は以下のような形をしています。
exports.helloGET = (req, res) => {
res.send('Hello World!');
};
そうです。
HTTP Tutorial | Cloud Functions Documentation | Google Cloud
上の Handler だけを取り出したうえで名前付き exports になった形なのです。
ということで、残りは
- handler を名前付き exports にする
- そのうえでテストコードを書く
とやれば少なくとも ExpressJS のテスト周りの知見を Function の開発に活かせる、とまぁこういう寸法です。
つづき
超今さらExpress触ってみた - その3 Cloud Functions Emulatorでも動くようにする - あーありがち(2018-09-12)