Вызов функций экспресс-проверки как отдельных операторов вместо использования вызова через запятую не работает

1
module.exports.register = function(req,res,next){

    body('fname').isLength({ min: 3, max:20 }).withMessage('First name must have minimum 3 chars and maximum 20 chars.')
    .isAlpha().withMessage('First name has non-alphabetic characters.');

    body('email').trim().isEmail().withMessage('Not in the email format');

    sanitizeBody('fname').trim().escape();

    sanitizeBody('email').trim().escape();

    const errors = validationResult(req);

    if(!errors.isEmpty()){
        sendResponse(res,{status: 422 ,body:errors});
    }
    else{
        next();
    }
}

Эта часть кода выполняется, но экспресс-валидатор, похоже, не выполняет свою функциональность.

Вместо этого приведенный ниже код работает нормально. Но я полагаю, что в обоих случаях это должно сработать.

module.exports.register = [

    body('fname').isLength({ min: 3, max:20 }).withMessage('First name must have minimum 3 chars and maximum 20 chars.')
    .isAlpha().withMessage('First name has non-alphabetic characters.'),

    body('email').trim().isEmail().withMessage('Not in the email format'),

    sanitizeBody('fname').trim().escape(),

    sanitizeBody('email').trim().escape(),

    (req, res, next) => {

        const errors = validationResult(req);

        if(!errors.isEmpty()){
            sendResponse(res,{status: 422 ,body:errors});
        }
        else{
            next();
        }
    } 
]

Я не могу найти что-либо относящееся к моему запросу в документе. Любая помощь? Заранее спасибо.

Теги:
express
validation
sanitization

1 ответ

0
Лучший ответ

В express-validation "заявления" по существу выражают функции промежуточного слоя. Это означает, что каждый из них возвращает функцию с function(req, res, next) подписи function(req, res, next). Эти функции призваны вызывать экспресс-API.

Что происходит в вашем первом примере, так это то, что каждый оператор просто возвращает функцию, которая на самом деле не вызвана. Ваш первый пример эквивалентен этому:

module.exports.register = function(req,res,next){

    function(req,res,next) {...}
    function(req,res,next) {...}
    function(req,res,next) {...}
    function(req,res,next) {...}

    const errors = validationResult(req);
    if(!errors.isEmpty()){
        sendResponse(res,{status: 422 ,body:errors});
    }
    else{
        next();
    }
}

Теоретически вы можете переформатировать свой первый пример и заставить его работать, но вы, вероятно, закончите аддон с обратным вызовом, и я бы не советовал его. Что-то из этих строк:

module.exports.register = function(req,res,next){
    (body('fname').isLength({ min: 3, max:20 }).withMessage('First name must have minimum 3 chars and maximum 20 chars.').isAlpha().withMessage('First name has non-alphabetic characters.')) (req, res, 
      (body('email').trim().isEmail().withMessage('Not in the email format')) (req, res,  
          (sanitizeBody('fname').trim().escape()) (req, res, 
              (sanitizeBody('email').trim().escape()) (req, res, function(req, res, next) {

                 const errors = validationResult(req);

                   if(!errors.isEmpty()){
                     sendResponse(res,{status: 422 ,body:errors});
                   }
                   else{
                     next();
                   }
                })))));
}

Не используйте этот код, это просто пример того, как могут быть уродливые вещи. Используйте массив, как в вашем втором примере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню