Express根路由响应正常,子路由返回空响应问题排查
Express子路由无响应问题解决
问题现象
- 根路由
/请求正常,能返回「message sent」 /admin及其他自定义子路由请求返回空响应,服务器端对应路由内的日志代码未执行
问题根源
查看app.ts的代码顺序发现:app.listen()在挂载CORS中间件和路由之前执行。Express中,app.listen()会启动HTTP服务器,之后再挂载的中间件、路由不会被应用到已启动的服务器上,导致除启动前已挂载的路由外,后续路由都无法被匹配。
原错误代码(app.ts)
const app: Express = express(); const corsOptions:CorsOptions ={ origin:['http://127.0.0.1:3000','http://localhost:3000'], methods:"*", allowedHeaders:'*' } const port = process.env.PORT || 8000; app.use(express.json()) // 错误:先启动服务器,再挂载中间件和路由 app.listen(port, () => { console.log(`[server]: Server is running at http://localhost:${port}`); }); app.use(cors(corsOptions)) app.use('/',router)
修复方案
将app.listen()移到所有中间件和路由挂载的最后,确保服务器启动前所有路由和中间件都已加载:
const app: Express = express(); const corsOptions:CorsOptions ={ origin:['http://127.0.0.1:3000','http://localhost:3000'], methods:"*", allowedHeaders:'*' } const port = process.env.PORT || 8000; // 先挂载中间件 app.use(express.json()) app.use(cors(corsOptions)) // 再挂载路由 app.use('/',router) // 最后启动服务器 app.listen(port, () => { console.log(`[server]: Server is running at http://localhost:${port}`); });
验证结果
重启Express服务器后:
- 前端请求
http://localhost:8000/admin/能正常拿到new token sent!响应 - 服务器端会输出
here日志 - 其他自定义子路由也能正常响应
内容的提问来源于stack exchange,提问作者Ghazi
相关产品推荐
相关产品推荐

