2017-11-22 4 views
1

Ich bin neu in Skill und Nodejs Entwicklung und bekam mein erstes Problem sehr bald.Lesen von DynamoDB mit Lambda nodejs für Alexa Skill

Im Grunde versucht Iam, Daten aus DynamoDB zu lesen und über Alexa sprechen zu lassen.

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;    
     } 
    }); 
} 

Das Problem ist, dass die DynamoDB.DocumentClient.get Funktion asynchron und gleichzeitig ausgeführt wird, wenn der DoSomethingIntent läuft der Titel Variable ist nicht definiert.

Was wäre die beste Vorgehensweise, um dieses Problem zu lösen?

Die einzige Lösung, die bisher für mich gearbeitet hat war, dass:

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

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

Aber es für mich nicht sehr praktisch scheinen!

+0

rufen Sie 'Get'-Methode innerhalb der' DoSomethingIntent' Intent. –

+0

das funktioniert nicht. ddb.get (params, function (err, data) {}); läuft asynchron. –

+0

'DoSomethingIntent': function() { getData (Callback (Titel) { this.response.speak ('Hier sind Ihre Daten' + title); this.emit (': responseReady');}) } –

Antwort

1

Ihre Arbeitslösung ist korrekt, da, wenn Sie die Ausführungslogik schreiben, sie vor dem Abschluss des Dynamodb-Rückrufs ausgeführt wird. Denken Sie daran, dass der DynamoDB-Aufruf asynchroner nicht blockierender E/A ist, sodass kein Code blockiert wird, der außerhalb des Rückrufs ausgeführt wird. Also besser Ort zum Hinzufügen von Alexa-Ausführungslogik ist im Callback.

Verwandte Themen