超今さらExpress触ってみた - その3 Cloud Functions Emulatorでも動くようにする
超今さらExpress触ってみた - その2 Routerと実際のRequest Handlerを分けたい - の続き。
Request Handlerを名前付きexportsにする
index.js
module.exports = (req, res) => {
res.send('Hello Express')
}
が、こうなる。
module.exports.hello = (req, res) => {
res.send('Hello Express')
}
あわせて router.js がこう。
const {hello: IndexHandler} = require('./index')
module.exports = (app) => {
app.get('/', IndexHandler)
return app
}
これで Express アプリ側は今まで通りに動く。
ES Moduleのimport asはObject Destructuringで
上の
const {hello: IndexHandler} = require(
は見慣れない書き方ですが、
- module.exports は単なる Object Reference であり、named exports は単なる key-value の定義
- (key を合わせて)そのまま { } で受け取れば名前の付け替えは自由
- const { name } の書き方は単なる property shorthands
ということのようです。
- javascript - Can I use alias with NodeJS require function? - Stack Overflow
- Node.js module.exports vs. exports – freeCodeCamp.org
- 10. Destructuring
ただし、さらっと書いたけど
Node.js ES2015/ES6, ES2016 and ES2017 support
によると Object Destructuring は Node 6 以降の機能っぽいので、Node 4 LTS では使えないかも。まぁ Node 4 LTS はすでに EOL を迎えちゃってるので、いまこいつを気にしなきゃいけない環境はまずいんですが。
nodejs/Release: Node.js Foundation Release Working Group
名前付きexportsをCloud Functions Emulatorにdeploy
Google Cloud Functions Emulator動かしてみた - あーありがち(2018-06-04)
を参考に、
functions-emulator start
functions-emulator deploy hello --trigger-http
すればできあがり。
これで Cloud Functions Emulator 側でもアプリを serve できている状態になる。
Request Handlerがindex.jsだったわけ
前回までで作った Express アプリですが、
index.js | Request Handler |
server.js | Node.js が立ち上げる Express アプリ環境 |
router.js | 上記以外の routing だけを担う |
のような構造になっています。
LAMP 構成に慣れている人からすると node コマンドの引数に index.js を持ってきそうな感じがしますが、
gcloud と functions-emulator で共通に利用できる request handler のファイル名は index.js であり、かつ node コマンドに与えるファイル名は自由に変えられる
ので、あえて function を index.js に割り当てています。
ということで、ここまでで一応 Google Cloud Functions へ deploy 可能な Express アプリを作る型ができました。