alexa-sdkのhandlersを別ファイルに分割して管理する
この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の5日目の記事です。 サンプルスキルのコードを見ていると、handlersのコードが1ファイルにズラーっと書 […]
広告ここから
広告ここまで
目次
この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の5日目の記事です。
サンプルスキルのコードを見ていると、handlersのコードが1ファイルにズラーっと書かれていてちょっと読みにくい時があります。
個人的にはIntent毎にファイルを分割して管理したいし、ユニットテストしたいなーなどと考えるとできるだけ小分けにしたくなります。
ということで、今のところ個人的に気に入っている構成をまとめました。
いま試している構成
libの中にintentだけをまとめるディレクトリを作って管理しています。
$ tree -I node_modules
.
├── index.js
├── lib
│ ├── handlres.js
│ └── intent
│ ├── LaunchRequest.js
│ └── SessionEndedRequest.js
├── package-lock.json
└── package.json
index.js (Lambdaで呼び出すファイル)
ここは最低限のコードにしています。
const Alexa = require('alexa-sdk')
const handlers = require('./lib/handlers')
module.exports.handler = function (event, context, callback) {
var alexa = Alexa.handler(event, context)
alexa.registerHandlers(handlers)
alexa.execute()
}
/lib/intent/LaunchRequest.js
/lib/intent/
配下にIntent Name
.jsでファイルを配置します。
function LaunchRequest () {
const say = 'サンプルスキルへようこそ'
this.response.speak(say).listen(say)
this.emit(':responseReady')
}
module.exports = LaunchRequest
/lib/handlers.js
handlersをまとめるファイルです。
ここでhandlersのオブジェクトをまとめて作るようにしています。
const SessionEndedRequest = require('./intent/SessionEndedRequest')
const LaunchRequest = require('./intent/LaunchRequest')
const handlers = {
LaunchRequest,
'AMAZON.CancelIntent': SessionEndedRequest,
'AMAZON.StopIntent': SessionEndedRequest,
'SessionEndedRequest': SessionEndedRequest
}
module.exports = handlers
この構成にしてみて
1ファイルあたりのソースコードが短くなるので、管理がかなり楽です。
共通化して使いたい値や、フォーマット処理などもutil.jsのような別ファイルに切り出しておけばテストもやりやすいです。
今後について
/lib/intent/
配下のファイルを直接テストする方法が今のところ思いつかない状態です。
this.emit
をsinonあたりでStubにしてしまってテストするとかかなぁと思いつつ、まだそこまでやれてないので、出来次第記事にできればです。