在Express-Validator中validation

我正在使用快速validation器进行validation。 我正在使用mongoose数据库,它也有内置的validation。我想知道我应该使用哪一个?

我也想知道express-validator中的validation是否平行。 以此代码为例:

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()是一个自定义validation方法,用于检查电子邮件是否已经被注册或者没有被注册,它会向数据库查询以进行validation。 虽然没有在上面的代码中提到,但我也有其他几个请求后,我需要validation多个字段,其中每个数据库查询将在其中进行。

所以我想知道是否可以并行运行上面的每一个检查方法,因为这样做会更快,也会让我更喜欢。 我显然会喜欢使用一个模块来并行运行这些像asynchronous。 我也想知道这些检查方法是否已经并行运行?

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

express-validator是为了validation浏览器/客户端传递的input。 mongoose的validation是为了validation新创build的文件。 两者都有不同的目的,所以对于你应该使用哪一个,没有一个明确的答案。 你甚至可以使用两者。

至于validation的顺序:检查将连续进行。 您可以使用async.parallel()使它看起来好像检查是并行执行的,但实际上它们将不会被执行,因为检查是同步的。

编辑node-validator (因此express-validator )是一个stringvalidation程序。 唯一性testing不是string操作,而是在您的数据模型上运行,所以您不应该尝试使用node-validator (实际上,我甚至不认为您可以 )。

相反,我会build议使用Mongoose的uniquefunction,以确保电子邮件地址只出现一次在您的数据库中。

或者,使用支持asynchronous操作的validation程序模块,如async-validate

使用mongodb unique约束和express-validator会导致一些复杂的error handling:您需要分析不同地方的错误,并将其转换为通用格式以获得rest响应。 所以另一种方法是创build自定义的快速validation器,它将在mongodb中查找具有这样的值的logging:

 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支持asynchronousvalidation,所以你可以执行任何你需要的数据和stringvalidation,而不需要混合用户validation和低级数据库后端validation