这是我在这里的第一个问题:-)
我需要在我们的Cognito使用池中列出用户。似乎只能使用aws-sdk CognitoIdentityServiceProvider API来完成此操作。我从本地node.js获得以下代码以使其完美运行。它按预期列出了所有用户。
但是,将相同的代码放入AWS lambda函数时,其行为会有所不同。它仍然运行,但是它从未等待Cognito listUsers()调用返回。它只是简单地完成,就像“等待”根本没有等待一样。不会从client.listUsers(params,function(err,data)..._ block)调用console.log()。
我直接在Lambda内部以及从AWS API网关进行了测试。返回相同的null。调用本身成功,仅不返回任何数据。 请参阅最后的日志。
顺便说一句,我确实创建了一个角色,并添加了一个策略,使该角色可以完全访问cognito用户池。
我想念什么?感谢您的帮助!
马丁C。
----------------- code ------------------------
async function getUserList() {
console.log("enter LAMDA function**********");
var aws = require('aws-sdk');
aws.config.update({accessKeyId: 'xxxxxxxx', secretAccessKey: 'xxxxxxxxxxx'});
var CognitoIdentityServiceProvider = aws.CognitoIdentityServiceProvider;
var client = new CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: 'us-east-2' });
var params = {
UserPoolId: 'us-east-xxxxxxxx', /* required */
AttributesToGet: [
'given_name','family_name','phone_number','email','profile'
],
Filter: null,
Limit: 0,
PaginationToken: null
};
console.log("Right before call the listUser method");
let result = await client.listUsers(params, function(err, data) {
console.log("call back reached!");
if (err) {
console.log(err, err.stack); // an error occurred
const response = {
statusCode: 500,
body: JSON.stringify('An error occurred.'),
}
return response;
}
else {
console.log(data);
var count = data.Users.length;
// successful response
const response = {
statusCode: 200,
body: JSON.stringify("sucessful list users! User count="+count)
}
return response;
}
});
console.log("no waiting here. async!!!")
}
getUserList();
*************** Lambda日志*****************
**************从node.js调用时记录日志****************
答案 0 :(得分:0)
getUserList
是您的lambda函数吗?我不知道您为什么自己getUserList()
称呼它。
我知道,您使用的lambda运行时是nodejs版本> 8,您将await
关键字与回调函数一起使用(失败)=>您什么都没有等待。
当Lambda调用函数时,该函数(异步函数)将在返回或运行到函数末尾(无返回)时结束,在您的情况下,该函数在执行console.log("no waiting here. async!!!")
后结束。在本地环境中,功能已清除callstack
(在调用堆栈中没有任何回调函数)后结束。
正确的方法是,使用aws-sdk的Promise版本,然后使用await
语法获得结果。与How to use Async and Await with AWS SDK Javascript
async function getUserList() {
console.log("enter LAMDA function**********");
var aws = require('aws-sdk');
aws.config.update({ accessKeyId: 'xxxxxxxx', secretAccessKey: 'xxxxxxxxxxx' });
var CognitoIdentityServiceProvider = aws.CognitoIdentityServiceProvider;
var client = new CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: 'us-east-2' });
var params = {
UserPoolId: 'us-east-xxxxxxxx', /* required */
AttributesToGet: [
'given_name', 'family_name', 'phone_number', 'email', 'profile'
],
Filter: null,
Limit: 0,
PaginationToken: null
};
console.log("Right before call the listUser method");
try {
let result = await client.listUsers(params).promise(); // use Promise style
console.log(data);
var count = data.Users.length;
// successful response
const response = {
statusCode: 200,
body: JSON.stringify("sucessful list users! User count=" + count)
}
return response; // return to finish function
} catch (err) {
console.log(err, err.stack); // an error occurred
const response = {
statusCode: 500,
body: JSON.stringify('An error occurred.'),
}
return response;
}
}
getUserList(); // remove this line when deploy funtion to Lambda.