我有两个 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/