在Express-Validator中验证

时间:2013-07-13 07:57:29

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

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

我还想知道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()是一种自定义验证方法,用于检查电子邮件是否尚未注册,它会向数据库查询以进行验证。虽然上面的代码中没有提到,但我还有其他一些帖子请求,我需要验证多个字段,在这些字段中将对每个字段进行数据库查询。

所以我想知道是否可以并行运行上述每个检查方法,因为这会使它更快,并且我也会更像节点。我显然想使用一个模块来并行运行这些async。我还想知道这些检查方法是否已经并行运行了吗?

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

3 个答案:

答案 0 :(得分:10)

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

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

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

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

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

答案 1 :(得分:7)

同时使用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也支持异步验证,因此您可以执行所需的任何数据和字符串验证,而无需混合用户验证和低级数据库后端验证

答案 2 :(得分:0)

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

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