我的用户模型有两个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');
对于username
也是一样
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) { ... }
这是一种丑陋。
9条答案
按热度按时间z4bn682m1#
从技术上讲,您必须首先检查错误名称,因为并非所有错误的处理方式都相同。然后,您必须根据错误名称检查特定属性,如ValidationError附带的errors属性。
另外,您将字段名放在错误类型中,这是多余的,最好使用相同的错误类型,因为在错误检查过程中,您也将获得字段名。
因此,您的代码可以类似于:
然后,错误检查程序:
如果要缩短验证时间,您有多种选择。如果只有一种验证类型,则可以按如下方式进行:
错误检查过程的最小表达式类似于您在帖子中所写的内容:
这是可行的,因为如果errors没有定义,它将忽略for,但是这里忽略了所有其他的错误类型。
我还认为这些错误布局有点混乱,但不要指望在不久的将来会有所改变。
nnt7mjpx2#
只需编写下面的代码即可。
tez616oj3#
我使用AngularJS,所以
ngRepeat
在web表单上显示我的验证错误,我需要做的就是返回一个错误消息数组。有时Mongoose会抛出一个不是验证错误的错误,在这种情况下,Err.Errors对象将不会出现。我记录执行错误。我仍然使用Web表单上的相同位置向用户显示执行错误。
ezykj2lf4#
通过阅读所有这些答案,我认为最好创建效用函数并像这样重用它:
此函数通过向客户端发送所需响应和验证消息来处理
ValidationError
,并可选地使用console.log
在控制台中显示消息。然后在我们想要处理错误的控制器中,我们检查
err.name
是否为ValidationError
,如果是,我们使用上面的效用函数。然后,客户端将收到确认错误响应,如下所示:
输出:
w46czmvw5#
我发现这很有用,它显示了数组中的所有错误。
例如,我提交了一个短密码和无效的电子邮件形式.
结果就是这样
如果错误消息中有逗号
,
,请尝试不使用.split(',')
不需要
for
循环。确保模式中有验证错误消息。nmpmafwu6#
为什么不使用API中描述的
validation
方法呢?hmmo2u0o7#
下面是我处理mongoose验证错误的独特方法
该代码仍在进行中,一旦它准备好了,我会更新它,或者你可以帮助扩展我的代码。
nfeuvbwi8#
方法1
对于这种方法,我最好的猜测是使用通用验证器和基于承诺的返回,希望它能在以后有所帮助
方法2
将validate:Object与validator:function和消息:String一起使用
稍后,当你试图保存记录时,它将在catch函数中保存验证错误对象
例如
qyuhtwio9#
注意:违反约束会在保存时从MongoDB返回E11000错误,而不是Mongoose验证错误。