超今さら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)

More