Express-Validator 中的验证

Posted

技术标签:

【中文标题】Express-Validator 中的验证【英文标题】:Validation In Express-Validator 【发布时间】:2013-07-11 18:44:18 【问题描述】:

我正在使用 express-validator 进行验证。我正在使用猫鼬作为数据库,它还内置了验证。我想知道我应该使用哪一个?

我还想知道 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();

isUn​​ique() 是一种自定义验证方法,用于检查电子邮件是否尚未注册,它会查询数据库以进行验证。虽然在上面的代码中没有提到,但我还有一些其他的发布请求,我需要验证多个字段,每个字段都会进行数据库查询。

所以我想知道是否可以并行运行上述每个检查方法,因为这会使其更快,并且我也会更喜欢节点。我显然会喜欢使用一个模块来像异步一样并行运行这些模块。我也想知道这些检查方法是否已经在并行运行?

请帮我解决这个问题?提前致谢。

【问题讨论】:

【参考方案1】:

express-validator 用于验证浏览器/客户端传递的输入; Mongoose 的验证旨在验证新创建的文档。两者都有不同的用途,因此对于您应该使用哪个没有明确的答案。你甚至可以同时使用两者。

关于验证顺序:检查将按顺序执行。您可以使用async.parallel() 使其显示就好像检查是并行执行的,但实际上它们不会,因为检查是同步的。

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

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

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

【讨论】:

为什么我不能让它们并行工作?我的意思是如果它是 async.parallel(),那为什么它仍然是同步的?在我看来,它们是创建错误的函数,我们在完成这些验证后检查该错误。如果我是正确的,那么我们可以在所有验证完成后使用并行并检查错误。请澄清我的问题 async.parallel 只会并行化异步调用 (I/O),而 Express-validator-calls 则不会。查看the relevant documentation,了解如何处理错误(在所有验证完成后完成)。 这是 express-validator 或 node-validator 的问题吗?如果它的节点验证器比我认为它很难修复它?但如果它与 express-validator 相比,我希望可以做点什么。 您指的是什么“问题”?应该修复什么? 你说 express-validator-calls 不是异步的。那么是调用非异步的 express-validator 还是 node-validator?【参考方案2】:

同时使用 mongodb unique 约束和 express-validator 会导致错误处理有点复杂:需要分析不同地方的错误并将其转换为通用格式以进行休息响应。 因此,另一种方法是创建自定义 express 验证器,它将在 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 也支持异步验证,因此您可以执行所需的任何数据和字符串验证,而无需混合用户验证和低级数据库后端验证

【讨论】:

【参考方案3】:

Express-Validator 无法检查电子邮件地址是否唯一,另一方面,MongoDB 不负责检查您输入的电子邮件地址格式是否正确。

因此,您必须在需要时同时使用它们,因为它们的用途完全不同。

【讨论】:

以上是关于Express-Validator 中的验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用express-validator在单独的文件中实现验证

javascript 使用express-validator的公共验证节点。

如何使用 express-validator 对嵌套对象进行验证

javascript 如何使用express-validator验证表达式是否为空?

express-validator在Express 4中未正确初始化

使用 express-validator 作为 websockets 的中间件