2017-11-22 10 views
1

スキルとnodejs開発の新機能I've very soon soon。Alexaスキル用のLambda nodejsを使用したDynamoDBからの読み取り

基本的に、私はDynamoDBからデータを読み込み、Alexa上で話そうとしています。

var title; 

exports.handler = (event, context, callback) => { 
    getData(); 
    alexa = Alexa.handler(event, context, callback); 
    alexa.appId = APP_ID; 
    alexa.registerHandlers(handlers); 
    alexa.execute();  
}; 

const handlers = { 
    'LaunchRequest': function() { 
     this.emit('DoSomethingIntent'); 
    }, 
    'DoSomethingIntent': function() {  
     this.response.speak('Here are your data ' + title); 
     this.emit(':responseReady');   
    }, 
}; 

function getData() { 
    var ddb = new AWS.DynamoDB.DocumentClient({region:'eu-west-1'}); 
    var params = { 
     TableName: 'data', 
     Key: {'data_id' : 1,}, 
    };  
    ddb.get(params, function(err, data) { 
     if (err) { 
     }else{ 
      title = data.Item.title;    
     } 
    }); 
} 

問題はDynamoDB.DocumentClient.get機能がasynchronを実行しているとDoSomethingIntentが実行されると同時に、タイトルの変数が定義されていないということです。

この問題を解決するにはどうすればよいでしょうか?

ddb.get(params, function(err, data) { 
    if (err) { 

    }else{ 
     title = data.Item.title;          
     alexa.registerHandlers(handlers); 
     alexa.execute(); 
    } 
}); 

しかし、それは私にとって非常に実用的でいないようです:

これまでの私のために働いている唯一のソリューションは、ということでした!

+0

'DoSomethingIntent'インテント内で' get'メソッドを呼び出します。 –

+0

は動作しません。 ddb.get(params、function(err、data){});非同期で実行されます。 –

+0

'DoSomethingIntent':関数(){ のgetData(コールバック(タイトル){ this.response.speak( '現在地データ' +タイトル); this.emit( ':responseReady');}) } –

答えて

1

実行ロジックを記述すると、Dynamodbコールバックを完了する前に実行ロジックが実行されるため、実際の解決策は正しいです。 DynamoDBの呼び出しは非同期非ブロッキングI/Oであるため、コールバック以外で実行するコードはブロックされません。だから、Alexaの実行ロジックを追加する場所は、コールバックの内部です。

関連する問題