Использование функций для определения ValidationChains с express -validator - PullRequest
0 голосов
/ 07 февраля 2020

Я нахожусь в процессе рефакторинга API, и у нас был модуль, в котором мы определяли наши пользовательские валидаторы. Когда я узнал express-validator, мне было интересно заменить некоторые из этих логик c на соответствующий модуль.

Моя проблема в том, что я пытаюсь определить все цепочки проверки как функции, подобные документации и этой проблеме .

Но я продолжайте получать ошибки, такие как validation.run(req) is not a function, пример ниже:

(node:2870794) UnhandledPromiseRejectionWarning: TypeError: validation.run is not a function
...stack trace
(node:2870794) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

Я знаю, что это из-за неправильного использования async/await, но я довольно растерян в том, как был бы лучший способ достичь желаемых результатов.

Вот мои некоторые из моих validator.js. validateDate - это функция для проверки пользовательского диапазона дат с использованием moment.js (я не мог заставить его работать, используя только express -validator из-за ограничений внешнего интерфейса:

const validate = validations => {
    return async (req, res, next) => {
        await Promise.all(validations.map(validation => validation.run(req)));

        const errors = validationResult(req);
        if (errors.isEmpty()) {
            return next();
        }

        res.status(422).json({ errors: errors.array() });
    };
};

const cpfValidator = cpfNumber => {
    let cpf = cpfNumber.replace(/[^\d]+/g, "");
    if (
        cpf == "00000000000" ||
        cpf == "11111111111" ||
        cpf == "22222222222" ||
        cpf == "33333333333" ||
        cpf == "44444444444" ||
        cpf == "55555555555" ||
        cpf == "66666666666" ||
        cpf == "77777777777" ||
        cpf == "88888888888" ||
        cpf == "99999999999"
    )
        return false;

    // Validate 1st digit
    let add = 0;
    for (let i = 0; i < 9; i++) add += parseInt(cpf.charAt(i)) * (10 - i);
    let rev = 11 - (add % 11);
    if (rev == 10 || rev == 11) rev = 0;
    if (rev != parseInt(cpf.charAt(9))) return false;

    // Validate 2nd digit
    add = 0;
    for (let i = 0; i < 10; i++) add += parseInt(cpf.charAt(i)) * (11 - i);
    rev = 11 - (add % 11);
    if (rev == 10 || rev == 11) rev = 0;
    if (rev != parseInt(cpf.charAt(10))) return false;

    return true;
};

// Validate only CPF number (similar to USA SSN)
const validateCpf = async (req, res, next) => {
    body("cpf", "CPF Inválido")
        .exists()
        .isLength({ min: 11, max: 11 })
        .isInt({ gt: 1, lt: 99999999999, allow_leading_zeroes: true })
        .custom(cpf => {
            return cpfValidator(cpf);
        })
        .run(req);
};

// Validate all field coming to the backend
const validateData = async (req, res, next) => {
    await body(
        "valor",
        `Minimum value could not be parsed to integer`
    )
        .isInt({ gt: parameters.valor_minimo })
        .withMessage(
            `Minimum value is R$ ${parameters.valor_minimo},00.`
        )
        .isInt({ lt: parameters.valor_maximo })
        .withMessage(
            `MAximum value is R$ ${parameters.valor_maximo},00.`
        )
        .run(req);
    await body("email")
        .optional()
        .isEmail()
        .withMessage("Formato de Email inválido")
        .normalizeEmail()
        .run(req);
    await body("celular")
        .optional()
        .isMobilePhone({ locale: "pt-BR" })
        .run(req);
    await body("data_inicio_contribuicao")
        .custom(firstContribution => {
            return validateDate(firstContribution, req.body.forma_pagamento);
        })
        .run(req);
};

module.exports = {validate, validateCpf, validateData};

А вот мой routes.js:

const express = require("express");
const router = express.Router();

const controller = require("../controllers/contribua.controller");
const validator = require("../utils/validator");

router.get("/parameters", controller.getParameters);
router.get(
    "/verify-cpf",
    validator.validate([validator.validateCpf]),
    controller.verifyCpf
);
router.post("/validate", validator.validate([validator.validateData]), (req, res) => {
    res.status(200).send({ message: "No problems found." });
});
router.post('/finish', validator.validate([validator.validateData]), controller.finish);

module.exports = router;

Вполне возможно, что я делаю что-то глупое или ошибаюсь в концепциях. Спасибо за любую помощь. Извините, если это будет лучше при переполнении стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...