質問編集履歴
1
いくつか追加で処理を変更してみたので、修正しました。回答お願いします!
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,18 +1,9 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
Alexaを購入したので、アプリを自宅用に作成しています。
|
3
3
|
node.jsでalexaの情報を受けて、dynamoを更新してから返答を返したいです。
|
4
|
-
slack連携のアプリをnode.jsで作っているのでnode.jsにトライしています。
|
5
|
-
(普段はPythonを利用していることが多いです)
|
6
4
|
|
7
5
|
かなり長いですが、よろしくお願いします。
|
8
6
|
|
9
|
-
### 発生している問題・エラーメッセージ
|
10
|
-
|
11
|
-
JavaScriptの非同期処理の順序立てのためのcallbackをうまく使えないのと、記法がよく分からないです。
|
12
|
-
```
|
13
|
-
speechOutput is undefined
|
14
|
-
```
|
15
|
-
|
16
7
|
### 該当のソースコード
|
17
8
|
|
18
9
|
```JavaScript
|
@@ -23,12 +14,13 @@
|
|
23
14
|
var dynamoDoc = new AWS.DynamoDB.DocumentClient({region: 'ap-northeast-1'});
|
24
15
|
const languageStrings = {
|
25
16
|
"ja": { "translation": {"STOP_MESSAGE": "スキルを終了します。",...}}};
|
17
|
+
dataEmitter = new myEmitter();
|
26
18
|
|
27
19
|
// dynamo process
|
28
|
-
function dynamoLogHandler(
|
20
|
+
function dynamoLogHandler(data) {
|
29
21
|
var params_update = {
|
30
22
|
TableName:'test_table',
|
31
|
-
Key:{"eventId":
|
23
|
+
Key:{"eventId":data.request.intent.solts.test.name},
|
32
24
|
AttributeUpdates:{
|
33
25
|
"points":{'Action':'ADD','Value': (- this.request.intent.solts.test.value)}},
|
34
26
|
ReturnValues:"UPDATED_NEW"
|
@@ -36,14 +28,19 @@
|
|
36
28
|
dynamoDoc.update(params_update,function(err,data_updated){
|
37
29
|
let speechOutput = String(data_updated.Attributes.points)+"更新しました";
|
38
30
|
});
|
31
|
+
// 今回修正した処理
|
32
|
+
dataEmitter.emit('data',speechOutput)
|
33
|
+
// 前回質問していた時の処理-> thisがundefinedになる
|
39
|
-
this.response.speak(speechOutput);
|
34
|
+
//this.response.speak(speechOutput);
|
40
|
-
this.emit(':responseReady');
|
35
|
+
//this.emit(':responseReady');
|
41
|
-
|
42
36
|
}
|
43
37
|
|
44
38
|
// test intent handler
|
45
39
|
function handlerTest(userGaveUp){
|
46
|
-
|
40
|
+
dynamoLogHandler(this);
|
41
|
+
// 現在の処理 -> ここまでで有れば正常にdynamoUpdateが走る
|
42
|
+
let speechOutput = dataEmitter.on('data',function(speechOutput){return speechOutput;}));
|
43
|
+
// トライした処理 -> この先を入れるとresponseが[Object Object]
|
47
44
|
// this.response.speak(speechOutput);
|
48
45
|
// this.emit(':responseReady');
|
49
46
|
}
|
@@ -66,15 +63,25 @@
|
|
66
63
|
};
|
67
64
|
```
|
68
65
|
|
66
|
+
### 全体の流れ
|
67
|
+
|
68
|
+
1. alexa handlerでtestIntentが設定されます。
|
69
|
+
2. testIntentHandlerが実行され、dynamoLogHandlerが呼び出されます。
|
70
|
+
3. dynamoDBを更新します(ここにはミスはないです)
|
71
|
+
4. dynamoLogHandlerの処理が終了すると、emitterでtestIntentHandlerに戻ります
|
72
|
+
(let speechOutput = dataEmitter.on('data',function);
|
73
|
+
5. `this.emit(':tell',speechOutput)`で発話内容をAlexaに返します
|
74
|
+
|
75
|
+
### 問題点
|
76
|
+
4番までで実行すると、全てが正常に実行されて進むのですが、
|
77
|
+
この、5番を入れると、emitterが[Object Object]として定義されてしまい、3,4を実行せずに終了してしまいます。
|
78
|
+
|
69
79
|
### 試したこと&分かっていないこと
|
80
|
+
`emitter`を利用することで、
|
70
81
|
|
71
82
|
`this.emit`の位置を変えたり、`return`を使ったり、`emitter`を使ったりしましたが、
|
72
83
|
`this`がscopeを超えて引き継がれなかったり、そもそもreturnの位置が間違えていたりと、
|
73
84
|
全くうまくいっていません。
|
74
85
|
|
75
86
|
また、sdkを参照して作っているのですが、`userGaveUp`が何を指すのかどのような使い方ができるのかが不明です。
|
76
|
-
全ての処理は記載していないですが、うまくいっていない部分は上記になります。
|
87
|
+
全ての処理は記載していないですが、うまくいっていない部分は上記になります。
|
77
|
-
|
78
|
-
### 補足情報(FW/ツールのバージョンなど)
|
79
|
-
|
80
|
-
node.js
|