質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Alexa

Alexa(アレクサ)は、米アマゾンが開発したクラウドベースのAIアシスタント。Amazon EchoやEcho dotに搭載され、話かけると音楽を再生したり、天気予報やスケジュールなど様々な情報を提供します。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2321閲覧

alexaの情報をdynamoDBにupdateしてから返答したい

hamar1

総合スコア26

Alexa

Alexa(アレクサ)は、米アマゾンが開発したクラウドベースのAIアシスタント。Amazon EchoやEcho dotに搭載され、話かけると音楽を再生したり、天気予報やスケジュールなど様々な情報を提供します。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/04/14 14:33

編集2018/04/21 07:05

前提・実現したいこと

Alexaを購入したので、アプリを自宅用に作成しています。
node.jsでalexaの情報を受けて、dynamoを更新してから返答を返したいです。

かなり長いですが、よろしくお願いします。

該当のソースコード

JavaScript

1// define and require 2const Alexa = require("alexa-sdk"); 3const APP_ID = undefined; 4var AWS = require('aws-sdk'); 5var dynamoDoc = new AWS.DynamoDB.DocumentClient({region: 'ap-northeast-1'}); 6const languageStrings = { 7 "ja": { "translation": {"STOP_MESSAGE": "スキルを終了します。",...}}}; 8dataEmitter = new myEmitter(); 9 10// dynamo process 11function dynamoLogHandler(data) { 12 var params_update = { 13 TableName:'test_table', 14 Key:{"eventId":data.request.intent.solts.test.name}, 15 AttributeUpdates:{ 16 "points":{'Action':'ADD','Value': (- this.request.intent.solts.test.value)}}, 17 ReturnValues:"UPDATED_NEW" 18 }; 19 dynamoDoc.update(params_update,function(err,data_updated){ 20 let speechOutput = String(data_updated.Attributes.points)+"更新しました"; 21 }); 22 // 今回修正した処理 23 dataEmitter.emit('data',speechOutput) 24 // 前回質問していた時の処理-> thisがundefinedになる 25 //this.response.speak(speechOutput); 26 //this.emit(':responseReady'); 27} 28 29// test intent handler 30function handlerTest(userGaveUp){ 31 dynamoLogHandler(this); 32 // 現在の処理 -> ここまでで有れば正常にdynamoUpdateが走る 33 let speechOutput = dataEmitter.on('data',function(speechOutput){return speechOutput;})); 34 // トライした処理 -> この先を入れるとresponseが[Object Object] 35 // this.response.speak(speechOutput); 36 // this.emit(':responseReady'); 37} 38 39// intent integrated handler 40const handlers = { 41 "LaunchRequest": function () {...}, 42 'Unhandled': function () {...}, 43 "testIntent": function() { 44 handlerTest.call(this, false); 45 } 46} 47 48exports.handler = function (event, context) { 49 const alexa = Alexa.handler(event, context); 50 alexa.APP_ID = APP_ID; 51 alexa.resources = languageStrings; 52 alexa.registerHandlers(handlers); 53 alexa.execute(); 54};

全体の流れ

  1. alexa handlerでtestIntentが設定されます。
  2. testIntentHandlerが実行され、dynamoLogHandlerが呼び出されます。
  3. dynamoDBを更新します(ここにはミスはないです)
  4. dynamoLogHandlerの処理が終了すると、emitterでtestIntentHandlerに戻ります

(let speechOutput = dataEmitter.on('data',function);
5. this.emit(':tell',speechOutput)で発話内容をAlexaに返します

問題点

4番までで実行すると、全てが正常に実行されて進むのですが、
この、5番を入れると、emitterが[Object Object]として定義されてしまい、3,4を実行せずに終了してしまいます。

試したこと&分かっていないこと

emitterを利用することで、

this.emitの位置を変えたり、returnを使ったり、emitterを使ったりしましたが、
thisがscopeを超えて引き継がれなかったり、そもそもreturnの位置が間違えていたりと、
全くうまくいっていません。

また、sdkを参照して作っているのですが、userGaveUpが何を指すのかどのような使い方ができるのかが不明です。
全ての処理は記載していないですが、うまくいっていない部分は上記になります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

(別質問)[https://teratail.com/questions/123009]にて解決

投稿2018/04/29 08:38

hamar1

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問