Я использую экспресс-валидатор и хотел бы иметь различные проверки на основе значения в теле запроса.
Я создал для этого функцию, но не получаю никаких ответов (т.е. экспресс просто зависает):
проверка / profile.js
module.exports = function (req,res,next) {
if (req.body.type == 'teacher') {
return check('name').exists().withMessage('Name is required'),
} else {
return check('student_id').exists().withMessage('Student id is required'),
}
}
app.js
router.put('/', require('./validation/profile'), (req, res, next) => {
const errors = validationResult(req).formatWith(errorFormatter)
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.mapped() })
} else {
res.send(req.user)
}
})
Однако если я напишу свою функцию как обычную функцию (а не как промежуточное ПО с 3 параметрами) и вызову ее, все будет работать. Но так у меня не будет доступа к объекту запроса. Я должен «жестко запрограммировать» параметры.
проверка / profile.js
module.exports = function (type) {
if (type == 'teacher') {
return check('name').exists().withMessage('Name is required'),
} else {
return check('student_id').exists().withMessage('Student id is required'),
}
}
app.js
router.put('/', require('./validation/profile')('teacher'), (req, res, next) => {
const errors = validationResult(req).formatWith(errorFormatter)
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.mapped() })
} else {
res.send(req.user)
}
})
Любые предложения о том, как я могу добиться различных проверок на основе значения в теле запроса?
Когда я смотрю документ express-validator, не похоже, что вы вообще правильно используете check(). check() сам возвращает промежуточное ПО. Вы должны использовать это таким образом. Я удалю свой ответ, так как ваш вопрос далек от того, что вводит в заблуждение.





express-validatorпроверить API создает промежуточное программное обеспечение, вы должны прикрепить его, чтобы выразить напрямую, или назовите его самостоятельно, как это сделал бы express.
// Use routers so multiple checks can be attached to them.
const teacherChecks = express.Router();
teacherChecks.use(check('name').exists().withMessage('Name is required'));
const studentChecks = express.Router();
studentChecks .use(check('student_id').exists().withMessage('Student id is required'));
module.exports = function (req,res,next) {
if (req.body.type == 'teacher') {
teacherChecks(req, res, next);
} else {
studentChecks(req, res, next);
}
}
Вы также можете использовать oneOf для того же.
router.put('/', oneOf([
check('name').exists().withMessage('Name is required'),
check('student_id').exists().withMessage('Student id is required')
], 'Invalid request body'), (req, res, next) => {
const errors = validationResult(req).formatWith(errorFormatter)
if (
!errors.isEmpty()
) {
return res.status(422).json({errors: errors.mapped()})
}
else {
res.send(req.user)
}
});
Оба они отлично поработали, спасибо! У меня есть еще один вопрос: что, если я хочу иметь несколько чеков каждого типа? Как я мог добиться этого с помощью первого метода?
Вы можете создать дополнительные маршрутизаторы и прикрепить к ним чеки, я обновил свой ответ решением.
require('./validation/profile')('teacher')должен возвращать функцию промежуточного программного обеспечения для правильной работы. Таким образом, вы выполняете его только один раз, когда ваш код впервые инициализируется. Здесь вообще нет промежуточного программного обеспечения.