Проблема с вашим кодом действительно заключается в следующей строке:
cognitoidentityserviceprovider.listUsers(params, function(err, data) {
...
});
Это старый способ обратного вызова в стиле асинхронного кода .
Реальный способ написания кода - вместо того, чтобы listUsers
функция принимала обратный вызов, она возвращает обещание. Тогда вы могли бы написать свой код так:
async getUserFirstAndLastName (userId) {
const params = {
UserPoolId: process.env.userPoolId, /* required */
AttributesToGet: [
'given_name',
'family_name'
/* more items */
],
Filter: `sub = \"${userId}\"`
};
try {
const data = await cognitoidentityserviceprovider.listUsers(params);
if(data.Users.length){
let userName = data.Users[0].Attributes[0].Value + " "; // First Name
userName += data.Users[0].Attributes[1].Value; // Last Name
return userName;
}
else {
return null; // no user found that matches email
}
}catch(err) {
throw err;
});
});
}
Предполагая, что вы не можете просто переписать эту функцию listUsers
, вы можете написать функцию, которая преобразует ее в функцию, которая возвращает обещание, например:
function convertCallbackFnToAsyncFn(fn) {
//Note that we are returning a function
return (...args) => new Promise(function(resolve, reject){
fn(...args, (err, data) => {
if (err) {
reject(err);
}
else {
resolve(data);
}
});
});
}
И в соответствии с решением выше:
try {
//I'm just naming it newFunction here to be really clear about what we're doing
const newFunction = convertCallbackFnToAsyncFn(cognitoidentityserviceprovider.listUsers);
const data = await newFunction(params);
....
Обратите внимание, что в своем ответе я использую синтаксис ES6 для спреда / отдыха и жирной стрелки.