You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Amplify AUTH Flutter报错:CreateAuthChallenge中await仅在async函数有效

问题排查与修复

核心错误点

  1. 字符串调用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,这就是你遇到的语法类错误根源。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:25:18