将异步函数返回值分配给Node.JS中的变量
我在下面有一个函数,它从DynamoDB获取数据,然后在评估条件时返回true或false。此功能将用于执行简单的检查,并确定用户的高程,以便进行数据访问等 如何使此函数执行以下操作:将异步函数返回值分配给Node.JS中的变量,node.js,asynchronous,async-await,amazon-dynamodb,aws-sdk-nodejs,Node.js,Asynchronous,Async Await,Amazon Dynamodb,Aws Sdk Nodejs,我在下面有一个函数,它从DynamoDB获取数据,然后在评估条件时返回true或false。此功能将用于执行简单的检查,并确定用户的高程,以便进行数据访问等 如何使此函数执行以下操作: var auth = aliasHasRole('foo','bar') console.log(auth) // prints value passed down by aliasHasRole(). 我想我必须声明它为async,并在返回之前添加wait,但没有运气,然后做了aliashhascole('f
var auth = aliasHasRole('foo','bar')
console.log(auth) // prints value passed down by aliasHasRole().
我想我必须声明它为async
,并在返回之前添加wait
,但没有运气,然后做了aliashhascole('foo','bar')。然后((x)=>{auth=x}
,但它返回未定义的
以下是完整的代码:
var AWS = require('aws-sdk');
AWS.config.update({
region: 'us-west-2',
accessKeyId: "xxx",
secretAccessKey: "xxx",
});
const docClient = new AWS.DynamoDB.DocumentClient();
function aliasHasRole(an_alias, a_role) {
const params = {
TableName: 'xxx',
KeyConditionExpression: '#alias= :alias AND #Role= :Role',
ExpressionAttributeNames: {
'#alias': 'alias',
'#Role': 'Role'
},
ExpressionAttributeValues: {
':alias': an_alias,
':Role': a_role,
}
};
docClient.query(params).promise()
.then(
(data) => {
//this line below returns true or false, how can I get I pass this value so I can return it from the aliasHasRole as true or false?
console.log(data.Items.length > 0 && data.Items[0].alias === an_alias && data.Items[0].Role === a_role ? true : false);
return data.Items.length > 0 && data.Items[0].alias === an_alias && data.Items[0].Role === a_role ? true : false;
})
.catch((err) => {
console.log(err)
})
};
var auth;
aliasHasRole("xxx","TeamManager");//should return true or false just like it logs it to the console.
//Do something to assign functions value to var auth.
console.log(auth) //print value passed by function...
//How can I assign this value to a variable? as in var auth = aliasHasTole('foo','bar') // auth is now true or false.
您没有正确使用async/await关键字。请像这样修改您的函数,然后重试
var AWS=require('AWS-sdk');
AWS.config.update({
地区:“美国西部2号”,
accessKeyId:“xxx”,
secretAccessKey:“xxx”,
});
const docClient=new AWS.DynamoDB.DocumentClient();
//您可以像这样使用async和Wait
让aliasHasRole=异步函数(一个\u别名,一个\u角色){
试一试{
常量参数={
TableName:'xxx',
KeyConditionExpression:“#别名=:别名和#角色=:角色”,
表达式属性名称:{
'别名':'别名',
“#角色”:“角色”
},
表达式属性值:{
“:别名”:一个_别名,
“:角色”:一个_角色,
}
};
//这将解析该值
let data=wait docClient.query(params.promise())
return data.Items.length>0&&data.Items[0]。别名===a_别名&&data.Items[0]。角色===a_角色?true:false;
}
捕捉(错误){
//这是等效的.catch语句
console.log(错误)
}
};
//在异步等待的情况下,这必须是自动执行的函数
(异步()=>{
var auth=等待别名hasRole(“xxx”,“团队经理”);
//这将打印将从aliasHasRole传递的auth值,即True或False
console.log(auth)//打印函数aliasHasRole传递的值。。。
})()
您也可以在不使用异步/等待的情况下使用它
var AWS=要求('AWS-sdk');
AWS.config.update({
地区:“美国西部2号”,
accessKeyId:“xxx”,
secretAccessKey:“xxx”,
});
const docClient=new AWS.DynamoDB.DocumentClient();
//您可以像这样使用async和Wait
函数别名角色(别名,角色){
常量参数={
TableName:'xxx',
KeyConditionExpression:“#别名=:别名和#角色=:角色”,
表达式属性名称:{
'别名':'别名',
“#角色”:“角色”
},
表达式属性值:{
“:别名”:一个_别名,
“:角色”:一个_角色,
}
};
//Return是最主要的部分。错误在于你没有使用带有Promise的Return关键字,这就是它不起作用的原因
返回docClient
.query(参数)
.承诺
.then(data=>data.Items.length>0&&data.Items[0]。别名===a_别名&&data.Items[0]。角色===a_角色?true:false)
.catch(错误=>{
//您可以在这里处理错误
console.log(错误)
})
};
别名角色(“xxx”,“团队经理”)。然后(auth=>{
//这将打印将从aliasHasRole传递的auth值,即True或False
//打印函数传递的值。。。
console.log(auth)
})
您的节点版本是greator然后是8,对吗?对不起,我说的是8.1,但看起来我至少在使用Node.js 10,它说的是var auth=wait aliasHasRole(“xxx”,“SuperAdmin”)代码>语法错误:等待仅在异步函数中有效
请再次检查。我已经编辑了答案,还添加了第二种实现方法。在async/Wait的情况下,为了避免这种语法错误,您必须在自执行函数下使用async。这两种方法现在都可以工作了,但第二种方法看起来更干净?具有讽刺意味的是,第一种方法是编写js代码的更广泛、更干净的方法。它隐藏了异步代码及其复杂性的背后。第一种方法传输到第二种方法,然后执行。这是从大于8.0的版本在nodejs下本机构建的。是的,既然您提到了它,我想让我想起的部分是关于匿名箭头函数的最后一部分(它是这样调用的吗?),但我可以看到它在我的实际代码中是如何“更有意义”的。非常感谢你,我一定会通过这段代码,并尝试学习它的一切!