2017-05-09 38 views
0

我有一个程序可以执行以下操作。在节点js中进行身份验证后的访问值

  • 查看DynamoDB表。
  • 从表格中获取数据。
  • 保存会话中的变量
  • 完成该过程后,在控制台中输出值。

我的代码如下所示。

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

检查值是否在DynamoDb中的方法。

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

     } 
    }); 
} 

,当我运行它,我得到的输出是:

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 

在这里,我知道,节点JS是非阻断的过程中,上面的输出是正确的,但我想要得到的城市价值session values after authentication are user city is {HereTheCityComes}而不是session values after authentication are user city is undefined

我确定在认证之后放置console.log(会话值是最后一个else块(返回数据的地方)中的用户城市是$ {session.attributes.city} );

但我需要这种类型的功能(获取数据,如我当前的场景中所示),因为在检查用户是否可用于数据库之后还有其他一些事情要做。

请让我知道我哪里错了,我该如何解决这个问题。

回答

0

您无法同步期望异步结果。 你可以在这里做的是用承诺解决你的问题。

这里是一个解决方案:

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

如果你不使用ES6,则只需安装蓝鸟和使用var Promise = require('bluebird')

相关问题