Node.js+Express+MongoDB API中GET /api/posts请求失败求助
出现"Cannot GET /api/posts"错误,核心原因是请求路径没有匹配到对应路由,结合你提供的代码,从以下几个方向排查:
1. 检查路由路径与挂载前缀的重复问题
你的PostController中定义了path = '/posts',并在初始化路由时用this.router.get(${this.path}, this.get)注册了GET路由。如果主app挂载该controller的router时已经指定了/api/posts前缀,就会导致实际路由变成/api/posts/posts,自然匹配不到/api/posts。
修复方式:
修改controller的路由注册代码,将路径改为根路径(空字符串或/):
private initialiseRoutes(): void { // 原代码:this.router.get(`${this.path}`, this.get); this.router.get('/', this.get); // 改用根路径 }
这样当主app以app.use('/api/posts', postController.router)挂载时,GET请求/api/posts就能正确匹配到该路由。
如果主app挂载的是/api前缀(比如app.use('/api', postController.router)),那原代码的路由注册是正确的,此时需要确认挂载代码是否正确执行。
2. 确认路由注册顺序
Express的路由匹配是按注册顺序执行的,如果在PostController的路由之前,有通配符路由(如app.use('*', ...))或其他匹配/api/posts的路由,会导致请求被提前拦截。确保PostController的路由注册在这些路由之前。
3. 验证Controller的实例化与挂载
检查主app文件中是否正确初始化并挂载了PostController:
import PostController from './path/to/post.controller'; const app = express(); // 初始化controller const postController = new PostController(); // 挂载到正确的前缀下 app.use('/api', postController.router);
额外排查技巧
可以在controller的路由注册方法中添加日志,确认路由是否被正确加载:
private initialiseRoutes(): void { console.log(`已注册GET路由:${this.path}`); this.router.get(`${this.path}`, this.get); }
启动服务后查看控制台输出,确认路由是否成功注册。
内容的提问来源于stack exchange,提问作者Oogrim

