【问题标题】:Validation In Express-ValidatorExpress-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() 是一种自定义验证方法,用于检查电子邮件是否尚未注册,它会查询数据库以进行验证。虽然在上面的代码中没有提到,但我还有一些其他的发布请求,我需要验证多个字段,每个字段都会进行数据库查询。

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

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

【问题讨论】:

    标签: node.js validation express asynchronous express-validator


    【解决方案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 不负责检查您输入的电子邮件地址格式是否正确。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多