AWS Amplify AUTH Flutter报错:CreateAuthChallenge中await仅在async函数有效
问题排查与修复
核心错误点
字符串调用
join方法触发类型错误
代码中这两行存在逻辑错误:const randomDigits = digitGenerator.randomDigits(6).join(''); const challengeCode = String(randomDigits).join('');digitGenerator.randomDigits(6)返回数字数组,join('')后已经转为字符串。此时String(randomDigits)仍是字符串,而字符串没有join方法,执行这行代码会直接抛出TypeError: String(...).join is not a function,这就是你遇到的语法类错误根源。Lambda Handler未等待异步操作完成
createAuthChallenge是异步函数,但exports.handler调用时未加await:exports.handler = async (event) => { createAuthChallenge(event); };这会导致Lambda在
createAuthChallenge的异步操作(比如发送SMS)完成前就终止,不仅引发错误,还会导致验证码无法正常发送。同时Handler没有返回event,会导致Cognito无法接收挑战响应。
修复后的完整代码
const AWS = require('aws-sdk'); const digitGenerator = require('crypto-secure-random-digit'); function sendSMS(phone, code) { const params = { Message: `你的验证码是:${code}`, // 建议补充提示文本,提升用户体验 PhoneNumber: phone, }; return new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise(); } async function createAuthChallenge(event) { if (event.request.challengeName === 'CUSTOM_CHALLENGE') { // 直接生成6位数字字符串,无需重复处理 const challengeCode = digitGenerator.randomDigits(6).join(''); await sendSMS(event.request.userAttributes.phone_number, challengeCode); event.response.privateChallengeParameters = { answer: challengeCode }; } } exports.handler = async (event) => { // 等待异步函数执行完成 await createAuthChallenge(event); // 返回event,确保Cognito能接收处理后的响应 return event; };
额外检查项
- 确认Lambda执行角色拥有
SNS:Publish权限,否则会触发权限错误 - 检查用户属性中的
phone_number格式是否符合SNS要求(需包含国家码,例如+8613xxxxxxxxx)
内容的提问来源于stack exchange,提问作者kenta_desu
相关产品推荐
相关产品推荐

