【问题标题】:express-validator not producing validation errorsexpress-validator 不产生验证错误
【发布时间】:2018-07-23 10:51:36
【问题描述】:

我在尝试 express-validator v4.3.0 时遇到问题。
有一个使用 post 请求登录的基本示例。有两个参数电子邮件和密码。下面是我的代码。

routes.js 文件:

var express = require('express');  
var router  = express.Router();  
var validator = require('./validator');

router.post('/login', [sanitize('email').trim(), 
 validator.publicRouteValidate('login')], (req, res, next) => {
  console.log(req);
}  

validator.js 文件:

'use strict';  
const { check, validationResult } = require('express-validator/check');  
const { matchedData, sanitize } = require('express-validator/filter');

module.exports = {  
  publicRouteValidate: function (method) {  
    return (req, res, next) => {  
      switch (method) {  
        case 'login':  
          check('email').isEmail().withMessage('email must be an email')  
            .isLength({min: 109}).withMessage('minimum length should be 100 characters')  
        break;  
      }  

      var errors = validationResult(req)
      console.log(errors.mapped())
      if (!errors.isEmpty()) {
         res.status(422).json({ errors: errors.array()[0].msg })
      } else {
         res.send('login')
      }
}}}  

现在,当我只使用电子邮件进行 POST 请求时,电子邮件的值为 abc。所以我应该得到像 email must be an email 这样的错误。但我没有得到任何回应。那么我不知道的问题是什么?

【问题讨论】:

    标签: node.js express express-validator


    【解决方案1】:

    您的 publicRouteValidate 函数只是创建了一个验证器,但它从未被调用过。

    发生这种情况是因为,如文档所述,check 返回一个快速中间件。必须将此类中间件提供给快速路由才能完成工作。

    我建议您将该功能分成两部分:一个创建您的验证器,另一个检查验证错误的请求,在触及您的路线之前提前返回。

    router.post(
        '/login',
        createValidationFor('login'),
        checkValidationResult,
        (req, res, next) => {
            res.json({ allGood: true });
        }
    );
    
    function createValidationFor(route) {
        switch (route) {
            case 'login':
                return [
                    check('email').isEmail().withMessage('must be an email'),
                    check('password').not().isEmpty().withMessage('some message')
                ];
    
            default:
                return [];
        }
    }
    
    function checkValidationResult(req, res, next) {
        const result = validationResult(req);
        if (result.isEmpty()) {
            return next();
        }
    
        res.status(422).json({ errors: result.array() });
    }
    

    【讨论】:

    • 如果我想验证仅通过正文或仅通过查询的请求参数,那么我们如何在最新的快速验证器版本中实现。
    • 如果您同时想要两者,请查看buildCheckFunction。否则,您可以使用body()query()
    • 如果我想在 createValidationFor() 中访问请求,那么我们该怎么做呢?
    • 但我想要类似的东西。如果 req.body.type 存在,则对类型字段应用验证。如果 req.body.type = 'email' 然后应用验证电子邮件,如果 req.body.type = 'password' 然后应用验证密码。现在我将如何在 createValidationFor() 函数中得到这个。
    • @gustavohenke 哦,我错过了,对不起。我找到了另一种调用多个检查的方法,这可能更直观,我在这个问题上发表了评论。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多