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

node.js – 检查mongoose验证错误的最佳方式

我的US模型有两个 validation功能

User.schema.path('email').validate(function(value,respond) {
  User.findOne({email: value},function(err,user) {
    if(err) throw err;
    if(user) return respond(false);
    respond(true);
  });
},'EMAIL_EXISTS');

用户名相同

User.schema.path('username').validate(function(value,respond) {
  User.findOne({username: value},'USERNAME_TAKEN');

它们以以下格式返回错误

{ message: 'Validation Failed',name: 'ValidationError',errors: 
    { username: 
      { message: 'Validator "USERNAME_TAKEN" Failed for path username',name: 'ValidatorError',path: 'username',type: 'USERNAME_TAKEN' } } }

电子邮件路径的错误是类似的.是否有更聪明的方式检查这些错误比以下?

if (err && err.errors && err.errors.username) { ... }

这是一种丑陋

解决方法

在技​​术上你必须首先检查错误名称,因为并不是所有的错误都以相同的方式处理.然后,根据错误名称,您必须检查特定属性,作为ValidationError附带的errors属性.

此外,您将字段名称放在错误类型中,这是多余的,最好使用相同的错误类型,因为在错误检查过程中,您也将获得字段名称.

所以你的代码可以是:

User.schema.path('email').validate(function(value,'exists');

User.schema.path('username').validate(function(value,'exists');

然后,错误检查过程:

if (err) {
  switch (err.name) {
    case 'ValidationError':
      for (field in err.errors) {
        switch (err.errors[field].type) {
          case 'exists':
            ...
            break;
          case 'invalid':
            ...
            break;
          ...
        }
      }
      break;
    default:
      ...
  }
}

如果你想缩短这个,你有各种各样的选择.如果你只有一种类型的验证,你可以这样做:

if (err) {
  if (err.name == 'ValidationError') {
    for (field in err.errors) {
      ...
    }
  } else {
    // A general error (db,crypto,etc…)
    ...
  }
}

错误检查过程的最小表达式将与您在帖子中写入的内容相似:

if (err) {
  for (field in err.errors) {
    ...
  }
}

这将工作,因为如果错误没有定义,它将忽略.但是您在这里忽略了所有其他错误类型.

我也认为这些错误布局有点混乱,但不要指望在不久的将来会发生变化.

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

相关推荐