こういう人向け
- 下記のアクセスで失敗している人
- intent.slots.stotTypeA.name で取得している人
- intent.slots.stotTypeA.value で取得している人
前手条件(説明)
下記のようなスロットタイプとインテント(サンプル発話1件)があるとします。
■スロットタイプ
この状況で何故 intent.slots.userNames.valueを取得したら駄目なのか。
実際のログ貼ってみます。
これはAlexaシミュレータの左側の出力ログをコピペしたログになります。
※長いので色が付いている所だけ流し見してください。
{
"version": "1.0",
"session": {
"new": false,
"sessionId": "amzn1.echo-api.session.dummy",
"application": {
"applicationId": "amzn1.ask.skill.dummydummydummydummy"
},
"user": {
"userId": "amzn1.ask.account.dummydummydummydummy"
}
},
"context": {
"System": {
"application": {
"applicationId": "amzn1.ask.skill.dummydummydummydummy"
},
"user": {
"userId": "amzn1.ask.account.dummydummydummydummy"
},
"device": {
"deviceId": "amzn1.ask.device.dummydummydummydummy",
"supportedInterfaces": {}
},
"apiEndpoint": "https://api.fe.amazonalexa.com",
"apiAccessToken": "省略"
},
"Viewport": {
"experiences": [
{
"arcMinuteWidth": 246,
"arcMinuteHeight": 144,
"canRotate": false,
"canResize": false
}
],
"shape": "RECTANGLE",
"pixelWidth": 1024,
"pixelHeight": 600,
"dpi": 160,
"currentPixelWidth": 1024,
"currentPixelHeight": 600,
"touch": [
"SINGLE"
]
}
},
"request": {
"type": "IntentRequest",
"requestId": "amzn1.echo-api.request.dummydummydummydummy",
"timestamp": "2018-12-01T09:59:54Z",
"locale": "ja-JP",
"intent": {
"name": "subUserPoint",
"confirmationStatus": "NONE",
"slots": {
"userNames": {
"name": "userNames",
"value": "ユーザー 1",
"resolutions": {
"resolutionsPerAuthority": [
{
"authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.dummydummydummydummy.userNames",
"status": {
"code": "ER_SUCCESS_MATCH"
},
"values": [
{
"value": {
"name": "ユーザー1",
"id": "ccc28363fa483331f49945a6f38257e0"
}
}
]
}
]
},
"confirmationStatus": "NONE",
"source": "USER"
},
"amazonNumber": {
"name": "amazonNumber",
"value": "5000",
"confirmationStatus": "NONE",
"source": "USER"
}
}
}
}
}
上記の差異がわかりますかね、そうです。半角スペースの有無です。
上(intent.slots.userNames.value):「ユーザー 1」
下:「ユーザー1」
たとえば下記のような条件分岐していたら、
「ユーザー 1」(半角あり)はif文通らないです。
const userCheckString = intent.slots.userNames.value;
if(userCheckString === "ユーザー1"){
//書きたい処理
}
解決方法
if(userCheckString === "ユーザー1" || userCheckString === "ユーザー 1")
こんな何の捻りもなく今後の改修で2倍かかるようなコードは書かないでくださいね。
修正前:intent.slots.userNames.value
修正後:intent.slots.userNames.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["name"];
こうやって取得しましょう。[0]に関しては問題ない場合は[0]を使ってください。
複数ある場合は選択する必要があります。([1]など)
こうやって書くことによって表記揺れを気にせず書けるよって書き方でした。
僕はいつもこうやって書いてます。
intent.slots.userNames.valueが正しい値取れている時も、
intent.slots.userNames.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["name"]
こちらも生成されるので問題ありません。
0 件のコメント:
コメントを投稿