Возврат промежуточного программного обеспечения из промежуточного программного обеспечения

Я использую экспресс-валидатор и хотел бы иметь различные проверки на основе значения в теле запроса.

Я создал для этого функцию, но не получаю никаких ответов (т.е. экспресс просто зависает):

проверка / 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)
    }  
})

Любые предложения о том, как я могу добиться различных проверок на основе значения в теле запроса?

require('./validation/profile')('teacher') должен возвращать функцию промежуточного программного обеспечения для правильной работы. Таким образом, вы выполняете его только один раз, когда ваш код впервые инициализируется. Здесь вообще нет промежуточного программного обеспечения.
jfriend00 25.07.2018 20:37

Когда я смотрю документ express-validator, не похоже, что вы вообще правильно используете check(). check() сам возвращает промежуточное ПО. Вы должны использовать это таким образом. Я удалю свой ответ, так как ваш вопрос далек от того, что вводит в заблуждение.

jfriend00 25.07.2018 21:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
743
1

Ответы 1

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)
    }
});

Оба они отлично поработали, спасибо! У меня есть еще один вопрос: что, если я хочу иметь несколько чеков каждого типа? Как я мог добиться этого с помощью первого метода?

Balázs Vincze 25.07.2018 21:13

Вы можете создать дополнительные маршрутизаторы и прикрепить к ним чеки, я обновил свой ответ решением.

Jake Holzinger 25.07.2018 21:22

Другие вопросы по теме