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) {
    ...
  }
}

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

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

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...