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

Node.js环境下AWS Lambda读S3文件写入Cognito遇已存在用户终止问题

修复方案

原代码核心问题

  • 循环内直接return Promise,仅执行第一个用户创建逻辑就终止函数
  • 异步回调内的错误无法被外层try/catch捕获,一旦出现错误直接中断全部任务
  • 未对错误类型做分类判断,遇到邮箱已存在错误直接终止,没有跳过逻辑
  • 无结果统计容器,无法输出已存在用户的列表
  • 循环条件i<=data2.length会触发数组下标越界问题,CSV解析后未过滤空行,容易出现非预期报错

修改后完整代码

1. 用户创建逻辑

async function RegisterUser(data2) {
  // 初始化结果统计容器
  const result = {
    successUsers: [],
    existedUsers: [],
    failedUsers: []
  }
  // 过滤CSV空行和无效行
  const validRows = data2.filter(row => row.length >=3 && row[1]?.trim())
  // 遍历所有有效用户
  for(let i=0; i < validRows.length; i++) {
    const userRow = validRows[i]
    const userName = userRow[0]
    const email = userRow[1].trim()
    const password = userRow[2]
    const attributeList = [
      new AmazonCognitoIdentity.CognitoUserAttribute({ Name: "name", Value: userName }),
      new AmazonCognitoIdentity.CognitoUserAttribute({ Name: "email", Value: email })
    ]
    try {
      // 封装单用户创建为Promise 等待执行结果
      const cognitoUser = await new Promise((resolve, reject) => {
        userPool.signUp(email, password, attributeList, null, (err, result) => {
          if (err) return reject(err)
          resolve(result.user)
        })
      })
      result.successUsers.push(email)
      console.log(`用户${email}创建成功`)
    } catch (err) {
      // 判断是否为邮箱已存在错误
      if (err.message.includes('An account with the given email already exists')) {
        result.existedUsers.push(email)
        console.log(`用户${email}已存在,跳过`)
      } else {
        result.failedUsers.push({ email: email, error: err.message })
        console.log(`用户${email}创建失败:${err.message}`)
      }
    }
  }
  return result
}

2. Lambda Handler逻辑

exports.handler = async (event, context) => {
  try {
    // 读取S3 CSV文件
    const data = await S3.getObject({Bucket: 'user-data-file', Key: 'SampleCSVFile_2kb.csv'}).promise();
    const data1 = Buffer.from(data.Body).toString();
    // 解析CSV 过滤空行
    const data2 = data1.split("\r\n").filter(row => row.trim() !== '').map(row => row.split(","));
    // 执行批量用户创建
    const userPoolResponse = await RegisterUser(data2);
    // 返回全量执行结果
    return {
      statusCode: 200,
      body: JSON.stringify({
        message: '批量任务执行完成',
        ...userPoolResponse
      })
    }
  } catch (err) {
    return {
      statusCode: err.statusCode || 400,
      body: err.message || JSON.stringify(err.message)
    }
  }
}

实现效果说明

  • 批量任务不会因为单个用户创建失败中断,所有用户都会遍历完成
  • 邮箱已存在的用户会被自动跳过,统一收集到existedUsers数组返回
  • 其他原因创建失败的用户会被收集到failedUsers数组,附带错误原因
  • 所有创建成功的用户会被收集到successUsers数组返回

内容的提问来源于stack exchange,提问作者Haseeb Zahid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:24:04