我从这样的默认路由中获取了参数
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
答案 0 :(得分:2)
快递路线和中间件与订单有关。通过app
,use
,get
等添加到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')
}
})
因此,如果您的请求不匹配,它将沿着第一个路线到达