Я бы хотел проверить параметры с помощью такого промежуточного программного обеспечения. Проблема в том, что router.param всегда применяется перед первым middleware router.all (я также пробовал с router.use, он не работает, потому что параметр является общим для обоих промежуточных программ). Есть ли способ выполнить Middleware 1 до router.param?
// Middleware 1
router.all('/:firstId/checklist/:**secondId**/*',
(req, res, next) => {
console.log('Request matched')
next()
},
param('**secondId**', "Error message 2")
.isMongoId(),
checkValidationErrors
)
router.param('**secondId**', callback)
Однако Middleware 1 работает не так, как я ожидал. Если параметр является допустимым ObjectId MongoDB, 'Request matched'
регистрируется, следующие промежуточные программы применяются соответственно в зависимости от запроса. Если это недопустимый идентификатор, 'Request matched'
зарегистрировано NOT , ожидаемая ошибка - NOT , отправленная в ответе. Вместо этого я получаю эту ошибку от Mon goose, которая поступает из router.param:
MongooseError [CastError]: Cast to ObjectId failed for value "xxx" at path "_id" for model "XXX"
Я попытался прокомментировать router.param, и это решило проблему. Так что это, безусловно, связано с порядком исполнения.
Большое спасибо за помощь