我的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 举报,一经查实,本站将立刻删除。