Express route: поток управления с router.use / all и router.param - PullRequest
0 голосов
/ 22 января 2020

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

Большое спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Я не смог найти способ использовать промежуточное ПО с тем же параметром, что и router.param, и выполнить его до router.param, так как router.param, кажется, выполняется первым систематически. Но для этого есть обходной путь: перегруппировать промежуточное ПО, которое вы хотите выполнить перед router.param, в отдельный файл.

Вместо: app. js (основной файл приложения), перенаправляя на originalRouter (оригинальный файл роутера).

Поток управления должен быть следующим: приложение. js (основной файл приложения), маршрутизация до beforeParamMiddlewwareRouter, маршрутизация до originalRouter (исходный файл маршрутизатора)

ИЛИ

В приложении. js:

app.use('/path', beforeParamMiddlewwareRouter, originalRouter)

Не стесняйтесь предложить лучшее решение, если у вас есть. Я открыт для предложений.

0 голосов
/ 22 января 2020

Отразить это (Причина в вашем случае express ищет только :firstId/* в обоих случаях, потому что он подходит для обоих сценариев ios. Если первый шаблон / путь совпадает с входным URI, он делает не go ищите ваше промежуточное ПО 2.

// Middleware 1
router.all('/:firstId/*',
  param('firstId', "Error message 1")
    .isMongoId(),
  checkValidationErrors        
)

// Middleware 2
router.all('/:firstId/checklist/:secondId/*',
  (req, res, next) => {
     console.log('Request matched')
     next()
  },  
param('secondId', "Error message 2")
    .isMongoId(),
  checkValidationErrors
)

К

// Middleware 2
router.all('/:firstId/checklist/:secondId/*',
  (req, res, next) => {
     console.log('Request matched')
     next()
  }, 

param('secondId', "Error message 2")
    .isMongoId(),
  checkValidationErrors
)

// Middleware 1
router.all('/:firstId/*',
  param('firstId', "Error message 1")
    .isMongoId(),
  checkValidationErrors        
)
...