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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:06:02