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
相关产品推荐
相关产品推荐

