使用Sequelize、SQLite、VueJs时服务误调控制器错误方法
问题根源
你遇到的核心问题是路由定义冲突:在routes.js中,你给同一个GET /programms路径绑定了两个控制器方法:
app.get('/programms', ProgrammController.index) app.get('/programms', ProgrammController.indexRadar)
Express的路由匹配是按定义顺序执行的,一旦第一个路由规则匹配成功,就会直接执行对应的index方法,不会再往后检查第二个规则。所以不管你的Service里传什么参数,只要是GET /programms请求,都会触发index方法(打印"wrong destination")。
解决方案
这里提供两种可行的修复方式,选一种适合你的即可:
方式1:给indexRadar设置独立路由路径
修改routes.js,给indexRadar分配一个唯一的路径:
// 替换原来的两个GET /programms路由 app.get('/programms', ProgrammController.index) app.get('/programms/radar', ProgrammController.indexRadar) // 新增独立路径
然后修改ProgrammService.js里的indexRadar方法,请求对应的新路径:
indexRadar (radar) { console.log('indexRadar Service') return Api().get('programms/radar', { // 修改路径 params: { radar: radar } }) }
方式2:在同一个index方法中分支处理逻辑
如果不想修改路由路径,可以在ProgrammController.js的index方法里,根据请求参数判断执行哪段逻辑:
async index (req,res) { // 检查是否携带radar参数 if (req.query.radar) { console.log('right destination') // 这里写原来indexRadar方法里的逻辑 // ... } else { console.log('wrong destination') // 这里写原来index方法里的逻辑 // ... } }
同时可以删除routes.js里重复的app.get('/programms', ProgrammController.indexRadar),以及控制器里的indexRadar方法(或者保留但不再通过路由调用)。
额外说明
- 浏览器控制台打印"indexRadar Service"是因为Service的
indexRadar方法确实被调用了,但发送的请求路径还是/programms,被第一个路由拦截了。 - 服务器没打印"just index Service"是因为你这次请求没调用Service的
index方法,和路由问题无关。
内容的提问来源于stack exchange,提问作者LenzAbi
相关产品推荐
相关产品推荐

