2017-05-09 2 views
0

Ich habe ein Programm, das das folgende tut.Zugriffswerte nach Authentifizierung in Knoten js

  • Suchen Sie in einer DynamoDB-Tabelle.
  • Holen Sie sich die Daten aus der Tabelle.
  • Speichern Sie die Variablen in der Sitzung
  • Nach dem Prozess, drucken Sie die Werte in der Konsole.

Mein Code ist wie folgt.

intentHandlers['GetMYBusinessInfo'] = function (request, session, response, slots) { 
    console.log('entered ext bloxk'); 

    if (!session.attributes.userName) { 
     console.log('eneterd the user entered the block'); 
     var userName = 'jim'; 
     isUserRegistered(userName.toLowerCase(), function (res, err) { 
      if (err) { 
       response.fail(err); 
       console.log(err); 
      } 
      else if (!res) { 
       response.shouldEndSession = true; 
      } 
      else { 
       console.log(res); 
       var countRes = JSON.stringify(res.Count); 
       var unpUserRegion = JSON.stringify(res.Items[0].Region); 
       var unpUserCity = JSON.stringify(res.Items[0].State); 
       var userRegion = JSON.parse(unpUserRegion); 
       var userCity = JSON.parse(unpUserCity); 
       session.attributes.city = userCity; 
       session.attributes.region = userRegion; 
       console.log("parsed " + countRes + "\t region is " + userRegion); 
       session.attributes.userName = true; 
      } 
     }); 
    } 
    console.log(`session values after authentication are user city is ${session.attributes.city}`); 
} 

Die Methode, um zu überprüfen, ob der Wert in DynamoDb ist oder nicht.

function isUserRegistered(userName, callback) { 
    var params = { 
     TableName: "usersTable", 
     FilterExpression: "#nme = :nme", 
     ExpressionAttributeNames: { 
      "#nme": "Name", 
     }, 
     ExpressionAttributeValues: { 
      ":nme": userName 
     } 
    }; 

    var count = 0; 
    docClient.scan(params, function (err, data) { 
     if (err) { 
      console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2)); 
      callback(false, err); 
     } else { 
      console.log("Scan succeeded." + data.Items.length); 
      if (data.Items.length === 0) { 
       callback(false); 
      } 
      else { 
       data.Items.forEach(function (itemData) { 
        console.log("Item :", ++count, JSON.stringify(itemData)); 
       }); 
       callback(data); 
      } 

     } 
    }); 
} 

wenn ich dies ausführen, wird die Ausgabe, die ich erhalte, ist:

session values after authentication are user city is undefined 

Scan succeeded.1 

Item : 1 
{ 
    "ID": "3", 
    "State": "wisconsin", 
    "Region": "midwest", 
    "Name": "jim" 
} 

{ Items: [ { ID: '3', State: 'wisconsin', Region: 'midwest', Name: 'jim' } ], 
Count: 1, 
ScannedCount: 1 } 

parsed 1 region is midwest 

Hier weiß ich, dass Knoten js sein Non-blockierbare Prozess, der oben Ausgabe korrekt ist, aber ich möchte das erhalten Wert der Stadt gedruckt in session values after authentication are user city is {HereTheCityComes} anstelle von session values after authentication are user city is undefined.

Ich bin sicher, dass die Platzierung console.log( Sitzungswerte nach der Authentifizierung sind Benutzer Stadt ist $ {session.attributes.city} ); im letzten else-Block (Ort, an dem die Daten zurückgegeben werden).

Aber ich brauche diese Art von Funktionalität (Daten erhalten, wie in meinem aktuellen Szenario gezeigt), da es einige andere Dinge zu tun gibt nach der Überprüfung, ob der Benutzer in der Datenbank verfügbar ist.

Bitte lassen Sie mich wissen, wo ich falsch liege und wie kann ich das beheben.

Antwort

0

Sie können asynchrone Ergebnisse nicht synchron erwarten. Was Sie hier tun können, ist Ihr Problem mit Versprechen zu lösen. Hier

ist eine Lösung:

intentHandlers['GetMYBusinessInfo'] = function(request, session, response, slots) { 


console.log('entered ext bloxk'); 

    var userPromise = Promise.resolve(); 
    if (!session.attributes.userName) { 
    console.log('eneterd the user entered the block'); 
    var userName = 'jim'; 
    userPromise = new Promise(function (resolve, reject) { 
     isUserRegistered(userName.toLowerCase(), function (res, err) { 
     if (err) { 
      response.fail(err); 
      reject(err); 
     } 
     var countRes = JSON.stringify(res.Count); 
     var unpUserRegion = JSON.stringify(res.Items[0].Region); 
     var unpUserCity = JSON.stringify(res.Items[0].State); 
     var userRegion = JSON.parse(unpUserRegion); 
     var userCity = JSON.parse(unpUserCity); 
     session.attributes.city = userCity; 
     session.attributes.region = userRegion; 
     console.log("parsed " + countRes + "\t region is " + userRegion); 
     resolve(res); 
     }); 
    }); 
    } 
    userPromise.then(function() { 
    console.log(`session values after authentication are user city is ${session.attributes.city}`); 
    }); 
} 

Wenn Sie nicht ES6 verwenden, dann nur drossel installieren und verwenden var Promise = require('bluebird')