Express存在多条路由规则时始终仅匹配根路径问题求助
问题根因
Express 路由会按照代码注册的从上到下顺序匹配,你写的app.get("*")是匹配所有GET请求的通配符路由,如果它的注册顺序在其他业务路由之前,所有请求会优先被这个通配路由拦截,永远不会触发后面的其他路由。
解决步骤
- 第一步:调整路由注册顺序,所有业务路由、接口路由、认证路由(比如你用到的
/auth/sso对应路由)、静态资源托管规则,全部放在这个*通配符路由的前面注册,*路由仅作为兜底放在所有路由的最后面。
错误顺序示例:
正确顺序示例:// 错误:通配路由放在最前面 app.get("*", (req, res) => { /* 你的代码 */ }) app.get("/auth/sso", (req, res) => { /* 认证逻辑 */ }) app.get("/api/user", (req, res) => { /* 接口逻辑 */ })// 正确:其他路由全部放在前面 app.get("/auth/sso", (req, res) => { /* 认证逻辑 */ }) app.get("/api/user", (req, res) => { /* 接口逻辑 */ }) app.use(express.static(path.resolve(__dirname, "client", "build"))) // 通配路由放在最后做兜底 app.get("*", (req, res) => { /* 你的代码 */ }) - 第二步:优化现有通配路由内的代码执行顺序,
res.sendFile执行后就已经向客户端返回响应了,后续修改req.session.url的逻辑会在响应结束后才执行,不会生效,建议调整顺序:app.get("*", (req, res, next) => { req.session.url = req.url; console.log("requested *", req.session.url, req.url); if (req.session.user == null) { console.log('Went to * SSo',req.session.url, req.url); res.redirect("/auth/sso"); } else { console.log('not to * SSo',req.session.url, req.url); // 把session修改逻辑移到sendFile前面 if (req.session.url == '/' || req.session.url == '') { req.session.url = '/home' } res.sendFile(path.resolve(__dirname, "client", "build", "index.html")); } });
内容的提问来源于stack exchange,提问作者new
相关产品推荐
相关产品推荐

