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')