Amazon AlexaAWS

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にしてしまってテストするとかかなぁと思いつつ、まだそこまでやれてないので、出来次第記事にできればです。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts