node.js - 检查 Mongoose 验证错误的最佳方法

标签 node.js mongoose

我有两个 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}, function(err, user) {
    if(err) throw err;
    if(user) return respond(false);
    respond(true);
  });
}, 'USERNAME_TAKEN');

它们以下列格式返回错误

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

email 路径的错误类似。有没有比以下更聪明的方法来检查这些错误?

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

这有点丑。

最佳答案

从技术上讲,您必须首先检查错误名称,因为并非所有错误都以相同的方式处理。然后,您必须根据错误名称检查特定属性,如 ValidationError 附带的错误属性。

另外你将字段名放在错误类型中,这是多余的,最好使用相同的错误类型,因为在错误检查过程中你也会得到字段名。

所以你的代码可以是这样的:

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);
  });
}, 'exists');

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

然后,错误检查程序:

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

如果您想缩短它,您有多种选择。如果您只有一种类型的验证,您可以这样做:

if (err) {
  if (err instanceof mongoose.Error.ValidationError) {
    for (field in err.errors) {
      ...
    }
  } else {
    // A general error (db, crypto, etc…)
    ...
  }
}

错误检查过程的最小表达方式与您在帖子中所写的类似:

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

这将起作用,因为如果未定义错误,它将忽略 for。但是您在这里忽略了所有其他错误类型。

我也认为这些错误布局有点困惑,但不要指望在不久的将来会改变。

关于node.js - 检查 Mongoose 验证错误的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407007/

相关文章:

node.js - ERR_HTTP_HEADERS_SENT : Cannot set headers after they are sent to the client at ServerResponse

jquery - 使用 JQuery 使用 JWT,不断出错

javascript - GraphQL 大整数错误 : Int cannot represent non 32-bit signed integer value

mongodb - 查找一名用户,然后使用 MongoDB 根据其总积分获得排名

javascript - 如何使用其他集合的子数组数据过滤来自mongo集合子数组的数据

javascript - coffeescript 能否在 Node 运行时执行期间输出 sourcemap(非预编译)?

node.js - 如何等待mongodb获取值然后通过函数返回它

node.js - 无法访问 req.user 的属性

javascript - 如何使用 promise 链接 Mongoose 查询?

node.js - MongoDB Mongoose 连接数据库时出错