получение параметра из маршрута по умолчанию - PullRequest
1 голос
/ 13 октября 2019

Я получаю параметр от маршрута по умолчанию, как этот

conf.js: router.use('/' ,require('./hello'));

hello.js:

 router.get('/:param', async (req,res)=>{
    try{
       let { param }= req.params;
       console.log(param)
       let param = await Params.findOne({param});
       if(!param){
           return res.redirect('/not-found')
       }
  })

и когда я посещаю любойURL, который я обрабатываю или не обрабатываю (как это: router.use('/blah',require('./blah'));), код выше обрабатывает его, так как я могу предотвратить это и позволить фактическому обработчику обработать это? например, когда я перенаправлен на / не найден, это фактический / не найденный обработчик

 router.get('/', async (req,res)=>{
     try{
         res.render('notfound')
     }catch(err){
        return res.redirect(url.format({
            pathname: '/error',
            query: {
                message: err.message
            }
        }))
     }
 })

, но он обрабатывается как /:param

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Экспресс-маршруты и промежуточное ПО зависят от заказа. Каждое добавление к app через use, get, post и т. Д. На самом деле представляет собой одну длинную цепочку возможных совпадений для URL.

Если первый добавленный маршрут соответствует всем (впо крайней мере, все с одним компонентом пути), тогда, конечно, этот маршрут будет совпадать со всеми.

Решение состоит в том, чтобы добавить более конкретные маршруты, такие как app.get('/people') first, и перехватывать сообщения, такие как app.get('/:param') last.

Что касается случая "не найдено", я не понимаю, почему вы вообще ожидаете, что это произойдет. Конечно, любой путь компонента с одним путем будет соответствовать маршруту /:param. Поэтому, возможно, вам действительно нужно сопоставить только определенные значения параметра . Для этого Express поддерживает правила регулярных выражений. хорошее объяснение здесь .

1 голос
/ 13 октября 2019

если я вас понимаю, вам нужно установить этот маршрут /:param в конце цепочки маршрутизаторов

    router.use('/blah',require('./blah'))

  //then

 router.get('/:param', async (req,res)=>{
try{
   let { param }= req.params;
   console.log(param)
   let param = await Params.findOne({param});
   if(!param){
       return res.redirect('/not-found')
   }
})

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...