Я нахожусь в процессе рефакторинга 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;
Вполне возможно, что я делаю что-то глупое или ошибаюсь в концепциях. Спасибо за любую помощь. Извините, если это будет лучше при переполнении стека.