Node.js 在节点js中进行身份验证后访问值

Node.js 在节点js中进行身份验证后访问值,node.js,nonblocking,Node.js,Nonblocking,我有一个程序,可以完成以下任务 看看DynamoDB表 从表中获取数据 在会话中保存变量 完成此过程后,在console中打印值 我的代码如下 intentHandlers['GetMYBusinessInfo'] = function (request, session, response, slots) { console.log('entered ext bloxk'); if (!session.attributes.userName) { cons

我有一个程序,可以完成以下任务

  • 看看DynamoDB表
  • 从表中获取数据
  • 在会话中保存变量
  • 完成此过程后,在console中打印值
我的代码如下

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是不可阻塞的进程,上面的输出是正确的,但是我想得到身份验证后在
会话值为user city is{HereTheCityComes}
中打印的city值,而不是
身份验证后的会话值为user city is undefined

我确信放置
console.log(
sessionvalues-after-authentication-are-user-city是${session.attributes.city}
位于最后一个else块中(返回数据的位置)

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


请告诉我哪里出了问题,以及如何解决此问题。

您不能同步期望异步结果。 你能做的就是用承诺来解决你的问题

以下是一个解决方案:

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,那么只需安装bluebird并使用
var Promise=require('bluebird')