分离Express路由后无法将导出的Router模块用作中间件
问题分析与解决方案
你的核心问题是路由路径叠加导致匹配失败:
- 在
server.ts中,你将userRoutes挂载到了/login路径:app.use('/login', userRoutes) - 但在
controller.ts里,路由又定义了/login后缀:userRoutes.post('/login', ...)
这会让实际生效的接口路径变成/login/login,而你请求的是/login,自然返回Cannot POST /login。
两种解决方法
方法一(推荐):修改控制器内的路由路径
将controller.ts中的路由改为相对挂载路径的根路径:
// api/users/controller.ts import express, { Request, Response, Router } from 'express'; const userRoutes = Router(); // 把'/login'改成'/',对应挂载后的'/login'路径 userRoutes.post('/', (req: Request, res: Response) => { console.log('USER ATTEMPTED LOGIN'); res.send('LOGGED IN'); }); export default userRoutes;
同时统一ES模块导入语法,修改server.ts的导入代码:
// server.ts // 替换require为import import userRoutes from './api/users/controller';
方法二:修改服务器的挂载路径
如果想保留控制器内的/login路径,可将server.ts的挂载路径改为根路径:
// server.ts // 把'/login'改成'/' app.use('/', userRoutes);
但这种方式不利于后续扩展用户相关的其他路由,不推荐。
内容的提问来源于stack exchange,提问作者BobbyBorn2L8
相关产品推荐
相关产品推荐

