调用cognitoidentityserviceprovider.getUser().promise()报TypeError问题求助
问题原因与解决方案
嘿,这个问题我之前踩过一模一样的坑!其实核心原因很简单——你在调用cognitoidentityserviceprovider.getUser()的时候同时传入了回调函数,这直接导致返回值变成了AWS.Response对象,而只有AWS.Request对象才拥有.promise()方法,所以自然会抛出promise is not a function的错误。
AWS SDK的API调用有两种互斥的模式:
- 回调模式:当你传入回调函数作为第二个参数时,方法会立即执行请求,并直接返回
AWS.Response对象(这个对象里没有.promise()方法); - 请求对象模式:如果不传回调函数,方法会返回一个
AWS.Request对象,你可以通过这个对象调用.promise()来将请求转换为Promise,进而用async/await或者.then()来处理异步结果。
你的代码同时混用了这两种模式,这就造成了冲突。
修复后的异步实现方案
既然你的函数已经声明为async,推荐直接用async/await的方式重构代码,去掉多余的回调参数和回调逻辑:
async getUserDetails(accessToken) { const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider(); const params = { AccessToken: accessToken }; try { // 不传回调,拿到Request对象后调用.promise(),用await等待结果 const userData = await cognitoidentityserviceprovider.getUser(params).promise(); // console.log(userData); return userData; } catch (err) { // 这里可以根据业务需求处理错误,比如抛出错误或者返回错误信息 console.error('获取用户详情失败:', err); throw err; } }
调用方式
重构后,你可以在其他async函数里这样调用它:
async someOtherFunction() { try { const userDetails = await getUserDetails('你的AccessToken'); // 在这里使用userDetails里的用户属性 console.log('用户属性:', userDetails.UserAttributes); } catch (err) { // 处理错误 } }
这样就能完美异步获取用户属性,并且避免了之前的类型错误。
内容的提问来源于stack exchange,提问作者Aquiles Valdivia Orozco
相关产品推荐
相关产品推荐

