javascript - 使用函数通过 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.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;
很有可能我在做一些愚蠢的事情,或者我在概念上有问题。谢谢你的帮助。抱歉,如果堆栈溢出会更好。
解决方案
推荐阅读
- arrays - Chart.js - 访问 yAxes 属性
- amazon-web-services - 无法使用 Route 53 AWS 注册域
- python - TelegramBot,如何处理命令旁边的消息
- sql - 使用 REGEXP_LIKE 插入 Select 用于 10Mn+ 条运行缓慢的记录
- java - 创建父类的数组并向其添加子对象
- sympy - 在 sympy 中记录中介结果
- python - 如何导入和使用我的 python 包?
- c++ - 使用 Winsock 和 dirent 向客户端发送目录列表的问题
- machine-learning - 训练 YOLOv3 后缺课
- c++ - 用户输入的新 int