【问题标题】:Not getting any response - Express Validator没有得到任何回应 - Express Validator
【发布时间】:2018-03-30 07:17:32
【问题描述】:

我正在使用最新版本的 express-validator 进行验证。 我没有收到任何回复,但是旧方法(即checkBody)工作正常,而新方法(即check('keyName'))工作不正常。

下面是我的代码。

package.json

"express-validator": "^5.0.3",

routes.js

var authValidator = require('./../validation/auth.validation');
var routes = require('express').Router();

routes.post('/login', [
  authValidator.validateLogin, 
  authValidator.checkValidationResult ], function (req, res) {
     console.log('3');
     //res.send("Some other stuffs");
  }
);

module.exports = routes;

auth.validation.js

module.exports.validateLogin = validateLogin;
module.exports.checkValidationResult = checkValidationResult;

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

var response = require('./../general/MyResponse');
var messages = require('./../general/messages');

function validateLogin(req, res, next) {
  console.log('1');
  return [
    check('email').isLength({min: 1}).withMessage(messages.EMAIL_REQUIRED)
    .isEmail().withMessage(messages.INVALID_EMAIL),
    check('password').isLength({min: 1}).withMessage(messages.PASSWORD_REQUIRED),
  ]
}

function checkValidationResult(req, res, next) {
  console.log('2');
  var result = validationResult(req)
  if (!result.isEmpty()) {
    response.createResponse(
      res, 400,
      result.array()[0].msg,
      {'error': result.array()[0].msg}, {}
    )
  } else {
    next()
  }
}

我注意到节点 js 无法从 validateLogin 中的函数 auth.validation.js 继续前进。

谁能告诉我上面的代码有什么问题。

在控制台内部,仅显示 1 个。

我附上屏幕截图以供参考。

【问题讨论】:

    标签: node.js validation express express-validator


    【解决方案1】:

    我们需要使用简单的数组,不需要创建函数。

    点击此链接 Is it possible to do the validation in a separate file and not inline in the route? - GitHub 了解更多详情。

    代码应该是这样的。

    auth.validation.js

    var response = require('./../general/MyResponse');
    var messages = require('./../general/messages');
    
    const {check, validationResult} = require('express-validator/check');
    const {matchedData, sanitize} = require('express-validator/filter');
    
    module.exports.validateLogin = [
        check('email').isLength({min: 1}).withMessage(messages.EMAIL_REQUIRED).isEmail().withMessage(messages.INVALID_EMAIL),
        check('password').isLength({ min: 1 }).withMessage(messages.PASSWORD_REQUIRED),
    ];
    
    module.exports.checkValidationResult = checkValidationResult;
    
    function checkValidationResult(req, res, next) {
        console.log('2');
        var result = validationResult(req)
        if (!result.isEmpty()) {
            response.createResponse(res, 400,
                result.array()[0].msg,
                {'error': result.array()[0].msg}, {}
            )
        } else {
            next()
        }
    }
    

    `

    【讨论】:

    • 死代码:const {matchedData, sanitize} = require('express-validator/filter');
    • 我在其他验证函数中使用了 sanitize 方法,这就是我在那里声明常量的原因。
    • 不推荐使用整个 /check 要求,否则这是一个很好的答案
    【解决方案2】:

    validateLogincheckValidationResult 作为中间件应用到您的路由。在中间件中,您使用 next()method 调用队列中的下一个中间件。就像在您的checkValidationResult 中一样。

    validateLogin 的情况下,它不会将控制权传递给下一个中间件。但是来自express-validator v5 的check 方法本身就是一个中间件方法。因此我猜它不能正常工作。

    请看:https://github.com/ctavan/express-validator/issues/449

    尝试使用以下代码:

    routes.js

    var authValidator = require('./../validation/auth.validation');
    var routes = require('express').Router();
    var authValidations = authValidator.getAuthValidations();
    
    routes.post('/login', 
      authValidations,
      authValidator.checkValidationResult, function (req, res) {
         console.log('3');
         //res.send("Some other stuffs");
      }
    );
    
    module.exports = routes;
    

    auth.validations.js

    module.exports.getAuthValidations = getAuthValidations;
    module.exports.checkValidationResult = checkValidationResult;
    
    const {check, validationResult} = require('express-validator/check');
    const {matchedData, sanitize} = require('express-validator/filter');
    
    var response = require('./../general/MyResponse');
    var messages = require('./../general/messages');
    
    function getAuthValidations(req, res, next) {
      return [
        check('email').isLength({min: 1}).withMessage(messages.EMAIL_REQUIRED)
        .isEmail().withMessage(messages.INVALID_EMAIL),
        check('password').isLength({min: 1}).withMessage(messages.PASSWORD_REQUIRED),
      ]
    }
    
    function checkValidationResult(req, res, next) {
      console.log('2');
      var result = validationResult(req)
      if (!result.isEmpty()) {
        response.createResponse(
          res, 400,
          result.array()[0].msg,
          {'error': result.array()[0].msg}, {}
        )
      } else {
        next()
      }
    }
    

    【讨论】:

    • 如果您提供示例可能会更有帮助。
    • 死代码:const {matchedData, sanitize} = require('express-validator/filter');
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-06-27
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多