express-validator:只显示一个字段的验证错误消息

时间:2016-05-30 18:04:56

标签: javascript node.js express

我是expressjs和express-validator的新手。我有一个注册表,用户必须提交电子邮件地址(与其他字段)。我的电子邮件字段验证规则包含' express-validator'看起来像

req.checkBody('email', 'Email field is required').notEmpty().isEmail().withMessage('Invalid email address');

我正在使用jade打印出错误,如

  if errors.length  
    .alert.alert-danger
      a.close(href='#', data-dismiss='alert', aria-label='close') ×
      for error in errors
         div=error.msg 

上面的代码打印出与字段相关的所有表单错误,现在问题是,如果电子邮件字段为空,则显示两条错误消息'电子邮件字段是必需的'和'无效的电子邮件地址'

我想仅在电子邮件不为空的情况下评估第二个验证isEmail()。如果为空,则只需显示一条错误消息'电子邮件字段是必需的'。这有什么解决方案吗?

5 个答案:

答案 0 :(得分:1)

这对我有用。试试这个

req.getValidationResult().then(result=> {

 var errors = result.useFirstErrorOnly().array();

});

答案 1 :(得分:0)

由于isEmail()似乎已经验证字符串不为空,为什么不放弃notEmpty()? '电子邮件地址无效'如果电子邮件留空,则足以提供错误消息。

或者用

逐个显示错误
div=errors[0].msg

而不是

for error in errors
   div=error.msg

您可以在快速验证器中注册一个自定义验证器,它可以满足您的需求,但为什么会让您的生活变得复杂:)

答案 2 :(得分:0)

  const errors = validationResult(req);
  if (errors.isEmpty()) {
    return next();
  }
  const extractedErrors = []
  errors.array({ onlyFirstError: true }).map(err => extractedErrors.push({ [err.param]: err.msg }));

  return res.status(422).json({
    errors: extractedErrors,
  });

答案 3 :(得分:0)

尝试一下 .mapped()

返回:一个对象,其中键是字段名称,值是验证错误

以对象的形式获取每个失败字段的第一个验证错误。

const errors = validationResult(req).mapped()

答案 4 :(得分:0)

use the bail() method

app.post('/', [
  check('username')
    .isEmail()
    .bail()
    // If username is not an email, checkBlacklistedDomain will never run
    .custom(checkBlacklistedDomain)
    .bail()
    // If username is not an email or has a blacklisted domain, checkEmailExists will never run
    .custom(checkEmailExists);
]);