2016-06-26 12 views
0

Ich versuche Generatoren zu verwenden, um Daten von meiner lokalen DynamoDB zu setzen und zu erhalten. Mein Code gibt bisher ziemlich große Objekte zurück. Aber ich bin mir nicht sicher, ob ich tatsächlich mit der Datenbank interagiere. Und wenn dem so ist, kann ich nicht herausfinden, wie man tatsächlich Daten abruft. Eine andere Sache ist die Callback-Funktion, die benötigt wird, wenn keine Generatoren verwendet werden. Soll ich es auslassen? Wenn nicht, wie würde ich das Ergebnis zur nächsten() - Funktion bringen?Wie node.js Generatoren mit DynamoDB zu verwenden

Jede Hilfe wird sehr geschätzt! :-)

Bisher sieht mein Code wie folgt aus:

'use strict'; 

var AWS = require('aws-sdk'); 

AWS.config.update({accessKeyId: 'akid', secretAccessKey: 'secret'}); 
AWS.config.update({region: 'us-west-1'}); 
AWS.config.apiVersion = '2015-10-01'; 
//Using DynamoDB Local 
var dyn = new AWS.DynamoDB({ endpoint: new AWS.Endpoint('http://localhost:8000') }); 

//Wrap the async calls in a generator functions 
function* putItemGenerator(putParams) { 
    yield dyn.putItem(putParams); 
} 
function* getItemGenerator(getParams) { 
    yield dyn.getItem(getParams); 
} 

class User { 
    //The constructor creates a new user in the 
    //database and inserts his ID and name 
    constructor (args) { 
     this.userId = args.userId; 
     this.name = args.name; 

     let putParams = { 
      "TableName": "Users", 
      "Item": { 
       userId: { S: this.userId }, 
       name: { S: this.name } 
      } 
     }; 

     //Greate a generator and run it. 
     let result = putItemGenerator(dyn, putParams).next(); 

     console.log(" === PUT RESULT === "); 
     console.log(result.value); 
    } 

    //Get the User from the Database 
    getUser() { 
     var getParams = { 
      "TableName": "Users", 
      "ConsistentRead": true, 
      "Key": { 
       "userId": { S: this.userId }, 
      } 
     }; 

     let result = getItemGenerator(dyn, getParams).next(); 

     console.log(" === GET RESULT === "); 
     console.log(result.value); 

     return result.value; 
    } 
} 

var user = new User({ 
    userId: "1337", 
    name: "John Doe" 
}); 

user.getUser(); 

/* 
//I created the table with this script. 

'use strict'; 

var AWS = require('aws-sdk'); 

var createTables = function() { 
    AWS.config.update({accessKeyId: 'akid', secretAccessKey: 'secret'}); 
    AWS.config.update({region: 'us-west-1'}); 
    AWS.config.apiVersion = '2015-10-01'; 
    let dyn = new AWS.DynamoDB({ endpoint: new AWS.Endpoint('http://localhost:8000') }); 

    params = { 
     TableName : "Users", 
     KeySchema: [ 
      { AttributeName: "userId", KeyType: "HASH" } 
     ], 
     AttributeDefinitions: [ 
      { AttributeName: "userId", AttributeType: "S" } 
     ], 
     ProvisionedThroughput: {  
      ReadCapacityUnits: 1, 
      WriteCapacityUnits: 1 
     } 
    }; 
    dyn.createTable(params, function(err, data) { 
     if (err) 
      console.log(JSON.stringify(err, null, 2)); 
     else 
      console.log(JSON.stringify(data, null, 2)); 
    }); 
} 

createTables(); 
*/ 

Antwort

0

Ich fand heraus, dass ich will, was zu tun ist nicht möglich. Ein Getter, der seinen Wert durch eine E/A-Operation abruft, kann keinen Wert zurückgeben. Eine Best Practice wäre, ein sogenanntes Versprechen abzugeben. Dies kann von der aufrufenden Funktion verwendet werden, sobald der Wert verfügbar ist. Generatoren können den Code schöner und leichter lesbar machen.