2013-07-13 85 views
10

我使用express验证器进行验证。我使用猫鼬数据库,它也有内置的验证。我想知道我应该使用哪一个?快速验证器中的验证

我也想知道express-validator中的验证是否平行。拿这个代码,例如:

req.checkBody('email', 'Invalid email').notEmpty().isEmail().isUnique(); 
req.checkBody('password', 'Invalid possword').notEmpty().len(8, 30); 
req.checkBody('first_name', 'Invalid first_name').notEmpty().isAlpha(); 
req.checkBody('last_name', 'Invalid last_name').notEmpty().isAlpha(); 
req.checkBody('dateofbirth', 'Invalid dateofbirth').notEmpty.isDate(); 

isUnique设置()是来检查,如果电子邮件尚未注册与否,查询数据库来验证这样一个自定义的验证方法。虽然没有在上面的代码中提到,但我也没有几个其他的post请求,我需要验证多个字段,其中每个字段将在其中进行数据库查询。

所以我想知道它是否可能并行运行上述每个检查方法,因为这会使它更快,并且也会让我更喜欢节点。我显然希望使用一个模块来并行运行这些模块,比如async。我还想知道这些检查方法是否已经平行运行?

请帮我弄清楚这一点?提前致谢。

回答

10

express-validator是为了验证浏览器/客户端传递的输入; Mongoose的验证是为了验证新创建的文档。两者都有不同的目的,所以对于你应该使用哪一个来说并没有一个明确的答案。你甚至可以使用两者。

至于验证的顺序:检查将连续进行。您可以使用async.parallel()使其出现就好像检查并行执行一样,但实际上它们不会是因为检查是同步的。

编辑node-validator(因此express-validator)是一个字符串验证器。唯一性测试不是字符串操作,而是操作数据模型,因此您不应该尝试使用node-validator(实际上,我甚至不认为您可以可以)。

相反,我会建议使用Mongoose的unique功能来确保电子邮件地址只在您的数据库中出现一次。

或者,使用支持异步操作的验证程序模块,如async-validate

+0

为什么我不能让它们并行工作?我的意思是如果它做async.parallel(),那么为什么它仍然是同步?在我看来,它们是创建错误的函数,在完成这些验证后我们会检查这些错误。如果我是正确的,那么我们可以使用并行并在所有验证完成后检查错误。请澄清我的probs –

+0

'async.parallel'只会并行异步调用(I/O),而Express-validator-调用不是。请查看[相关文档](https://github.com/ctavan/express-validator#validation-errors)了解如何处理错误(在完成所有验证后也完成)。 – robertklep

+0

这是express-validator或node-validator的问题吗?如果它的节点验证器比我认为它很难修复它?但如果它与表达验证者相比我希望能做些什么。 –

6

使用mongodb unique约束和express-validator会导致一些复杂的错误处理:您需要分析不同位置的错误并将其转换为通用格式以获得休息响应。 所以另一种方法将创建自定义的明确的验证,这将在MongoDB中找到记录有这样的价值:

router.use(expressValidator({ 
    customValidators: { 
     isUsernameAvailable(username) { 
     return new Promise((resolve, reject) => { 
      User.findOne({ username: username }, (err, user) => { 
      if (err) throw err; 
      if(user == null) { 
       resolve(); 
      } else { 
       reject(); 
      } 
      }); 
     }); 
     } 
    } 
    }) 
); 

... 
req.checkBody('username', 'Username is required').notEmpty(); 
req.checkBody('username', 'Username already in use').isUsernameAvailable(); 


req.asyncValidationErrors().then(() => { 
... 

如果需要,请参阅该代码在我的网站总例如:https://maketips.net/tip/161/validate-username-available-using-express-validator

结论:express-validator还支持异步验证,因此您可以执行任何数据和字符串验证,而无需混合用户验证和低级别数据库后端验证