You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分离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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:22:47