从默认路由获取参数

时间:2019-10-13 20:34:04

标签: node.js express

我从这样的默认路由中获取了参数

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

,当我访问正在处理或未处理的任何网址时(例如:router.use('/blah',require('./blah'));) 上面的代码可以处理它,那么我如何防止这种情况发生并让实际的处理程序处理呢?例如,当我重定向到/ not-found时,这是实际的/ not-found处理程序

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

但它被处理为/:param

2 个答案:

答案 0 :(得分:2)

快递路线和中间件与订单有关。通过appuseget等添加到post的所有内容实际上都是该URL可能匹配的一长串。

如果您添加的第一条路线匹配所有内容(至少,只有一个路径成分的所有内容),那么可以肯定的是,该路线将匹配所有内容。

解决方案是先添加更具体的路由,例如app.get('/people'),最后添加包罗万象的app.get('/:param')

但是,对于“未找到”情况,我不明白为什么您会期望这种情况发生。当然,任何单路径组件路径都将匹配/:param路由。因此,也许您真正想要的是仅匹配 param的某些值。为此,Express支持正则表达式规则。有一个good explanation here

答案 1 :(得分:1)

如果我了解您,则需要在路由器链的末尾设置此路由/: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')
   }
})

因此,如果您的请求不匹配,它将沿着第一个路线到达