将异步函数返回值分配给Node.JS中的变量

将异步函数返回值分配给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

我在下面有一个函数,它从DynamoDB获取数据,然后在评估条件时返回true或false。此功能将用于执行简单的检查,并确定用户的高程,以便进行数据访问等

如何使此函数执行以下操作:

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下本机构建的。是的,既然您提到了它,我想让我想起的部分是关于匿名箭头函数的最后一部分(它是这样调用的吗?),但我可以看到它在我的实际代码中是如何“更有意义”的。非常感谢你,我一定会通过这段代码,并尝试学习它的一切!