首页 > 解决方案 > 使用函数通过 express-validator 定义 ValidationChains

问题描述

我正在重构一个 API,我们有一个模块,我们在其中定义了我们的自定义验证器。当我知道express-validator我有兴趣用适当的模块替换一些逻辑时。

我的问题是我试图将所有验证链定义为函数,类似于文档这个问题

但我不断收到类似的错误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.jsvalidateDate是一个检查自定义日期范围的函数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;

很有可能我在做一些愚蠢的事情,或者我在概念上有问题。谢谢你的帮助。抱歉,如果堆栈溢出会更好。

标签: javascriptnode.jsexpressasync-awaitexpress-validator

解决方案


推荐阅读