来自Yup自定义验证器的消息返回未定义的路径和引用名称

时间:2020-04-19 02:17:03

标签: node.js express validation yup

我正在尝试为yup验证库编写自定义测试,以供在节点/快速应用中使用,以测试两个字段是否相同-用例测试密码和确认密码字段是否匹配。逻辑在起作用,但是该方法提供的消息不起作用。

https://github.com/jquense/yup/issues/97#issuecomment-306547261

修改的自定义验证程序代码

自定义验证器

yup.addMethod(yup.string, 'isMatch', function (ref, msg) {
  return this.test({
    name: 'isMatch',
    message: msg || `${this.path} must be equal to ${this.reference}`,
    params: {
      reference: ref.path
    },
    test: function (value) {
      return value === this.resolve(ref);
    }
  });
});

示例用法

const schema = yup.object().shape({
  password: yup.string().min(8),
  passwordConfirm: yup.string().isMatch(yup.ref('password'))
})

const payload = {
  password: 'correctPassword',
  passwordConfirm: 'incorrectPassword'
}

schema.validate(payload)

从逻辑角度来看,上述方法可以正常工作。但是,在返回的错误消息中,this.paththis.reference的值均为undefined(即undefined must be equal to undefined)。它应该显示为passwordConfirm must be equal to password

我必须在this.path之前添加reference,否则节点崩溃,并出现path/reference is not defined的ReferenceError。

1 个答案:

答案 0 :(得分:1)

您无需编写自定义验证函数来检查两个字段是否匹配,可以使用内置的验证器.oneOf

将一组值列入白名单。添加的值会自动删除 来自任何黑名单(如果有)。 $ {values}插值可以 在message参数中使用。

请注意,即使未定义,未定义也不会使该验证程序失败 不包含在arrayOfValues中。如果您不希望undefined为 有效值,您可以使用Mixed.required。

在此处查看ref: oneOf(arrayOfValues: Array, message?: string | function): Schema Alias: equals

因此,您可以按以下方式重新编写架构(我也已在密码字段中添加了必填项):

const schema = yup.object().shape({
  password: yup.string().min(8).required('Required!'),
  passwordConfirm: yup.string().oneOf([Yup.ref('password')], 'Password must be the same!').required('Required!')
})