微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Mongoose 模型中呈现 *真正* 自定义正则表达式错误消息?

如何解决如何在 Mongoose 模型中呈现 *真正* 自定义正则表达式错误消息?

目前我在我的控制器方法中有这个工作:

const regex = new RegExp(
      '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})'
    );

    if (regex.test(req.body.password) === false) {
      throw new Error(
        'Your password must contain at least 8 characters: At least one number,at least one lower case letter,at least one upper case letter and at least one special character,like a fullstop.'
      );
    }

由于最佳实践表明必须在模型中完成数据清理,我想在那里进行验证,但似乎无法使用自定义错误消息使其正常工作。我尝试了一些不同的东西,最值得注意的是(在架构中):

      validate: {
        validator: function (v) {
          return /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})/.test(
            v
          );
        },message: (props) => `${props.value} is not a valid password!`,},

我使用这种方法遇到的问题是,尽管您似乎在设置消息值,但在邮递员中,它似乎带有一些看起来很糟糕的垃圾,我似乎无法摆脱 I.E. “用户验证失败:密码:”:)

出于信息目的,我通过以下方式删除了指定为唯一字段的丑陋猫鼬错误消息:

userSchema.post('save',function (error,doc,next) {
  if (error.name === 'MongoError') {
    if (error.message.includes('screenname')) {
      next(
        new Error(
          'A user with this screenname already exists. Please try another.'
        )
      );
    } else if (error.message.includes('email')) {
      next(new Error('A user with this email address already exists.'));
    }
  } else {
    next(error);
  }
});

不幸的是,同样的技术不适用于“验证”值。

谢谢。

解决方法

啊,我终于找到了解决办法:

userSchema.pre('save',async function (next) {
  const user = this;
  if (user.isModified('password')) {
    const regex = new RegExp(
      '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})'
    );
    console.log('1',user.password,regex.test(user.password));
    if (regex.test(user.password) === false) {
      console.log('2');
      next(
        new Error(
          'Your password must contain at least 8 characters: At least one number,at least one lower case letter,at least one upper case letter and at least one special character,like a fullstop.'
        )
      );
    }
    user.password = await bcrypt.hash(user.password,8);
  }
  next();
});

我希望对某人有所帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。