AWS Lambda PreSignUp正确响应格式是什么?相关报错如何解决
问题根源
你遇到的报错核心是2个低级错误导致的:
- 回调函数参数传反:Cognito触发器的Lambda回调规则是
callback(错误对象, 成功响应对象),你在逻辑执行正常的时候直接写了callback(event),相当于把event作为错误参数传给了回调,Cognito识别到你返回了错误对象,就抛出了UserLambdaValidationException,对象转字符串后就显示成了[object Object]。 - 重复邮箱检测逻辑完全失效:
forEach中的return {}只能跳出当前循环的单次执行,既不能终止整个循环,也不会触发错误回调,就算匹配到重复邮箱,代码还是会继续执行到后面的callback(event),等于校验逻辑白写了。
另外你的代码还有2个潜在问题:
- 直接全量拉取用户池用户遍历,用户量稍大就会触发分页、性能问题,甚至超过Lambda执行时长限制,完全没必要全量拉取。
- 直接取
Attributes[0].Value不可靠,Cognito返回的用户属性数组顺序不固定,可能取不到email对应的值。
修复后的代码
var AWS = require("aws-sdk"); const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider(); exports.handler = function(event, context, callback) { const targetEmail = event.request.userAttributes.email; var params = { UserPoolId: "us-east-1_xxxXXXxXX", // 直接加过滤条件,只查对应邮箱的用户,不用全量拉取 Filter: `email = "${targetEmail}"`, AttributesToGet: ["email"] }; cognitoidentityserviceprovider.listUsers(params, (err, data) => { if (err) { console.log(err, err.stack); // 错误情况传第一个参数 callback(err); return; } // 只要返回结果长度大于0,说明邮箱已存在 if (data.Users.length > 0) { // 构造错误对象返回给Cognito,前端就能拿到对应的错误提示 const duplicateError = new Error("该邮箱已被注册,请直接登录或使用其他邮箱"); callback(duplicateError); return; } // 校验通过,第一个参数传null表示无错误,第二个参数传event callback(null, event); }); }
额外注意事项
你需要给Lambda对应的执行角色添加cognito-idp:ListUsers的权限,否则调用listUsers接口会被权限拦截。
内容的提问来源于stack exchange,提问作者alaenvargut
相关产品推荐
相关产品推荐

