Node.js Express路由配置错误导致Cannot POST/GET 404问题
问题根因
所有静态资源必须加通配符才能访问、接口404、JSON解析报错的核心原因都是Express路由挂载路径与实际请求路径不匹配,不存在其他复杂依赖问题。
各异常现象对应的具体问题
- 静态资源必须写
*/images这类通配符才能生效
你的应用部署在二级路径/strapiClient下,不是域名根路径/。如果直接写app.use('/images', express.static(...)),Express只会匹配路径开头为/images的请求,不会匹配带/strapiClient前缀的静态资源请求,之前用通配符属于歪打正着覆盖了所有层级的路径,但这种写法会打乱路由匹配优先级,留下隐患。 - POST请求404、GET测试路由返回
Cannot GET /strapiClient/falauser
Express路由匹配遵循拼接规则:app.use的挂载路径 + 路由内部定义的路径 = 最终生效的请求路径。
你当前的配置是用*/falauser挂载路由模块,但falaUser.js内部又定义了/strapiClient的路由,最终实际匹配的路径是*/falauser/strapiClient,和你实际请求的/strapiClient/falauser路径顺序、层级完全不匹配,自然返回404。 SyntaxError: Unexpected token < in JSON at position 0报错
接口返回404时,Express默认返回HTML格式的错误页(内容开头为<!DOCTYPE html>,第一个字符就是<),但前端代码按JSON格式解析响应内容,直接抛出解析错误,和axios请求逻辑、后端JSON序列化逻辑无关。
修复方案
按以下步骤修改配置即可,不需要保留通配符写法:
- 统一配置应用根路径前缀,替换所有通配符写法
修改server.js中的静态资源、路由挂载代码:// 定义统一的应用根前缀,和页面访问的二级路径保持一致 const APP_ROOT = '/strapiClient'; // 静态资源配置,修正path.join的错误用法,去掉通配符 app.use(`${APP_ROOT}/images`, express.static(path.join(__dirname, 'public/images'))); app.use(`${APP_ROOT}/js`, express.static(path.join(__dirname, 'public/js'))); app.use(`${APP_ROOT}/css`, express.static(path.join(__dirname, 'public/css'))); app.use(`${APP_ROOT}/slick-1.8.1`, express.static(path.join(__dirname, 'public/slick-1.8.1'))); // 路由挂载,修正路径顺序 app.use(`${APP_ROOT}/falauser`, falaUser); - 修改falaUser.js的路由定义,去掉重复的路径前缀
路由挂载时已经拼接了/strapiClient前缀,内部路由只需要写业务子路径即可:// 最终匹配的POST路径为 /strapiClient/falauser router.post('/', function (req, res, next) { console.log(req.body); axios .post(config.get("botUrl"), req.body) .then((dataBot) => { console.log(dataBot.data.responses); res.json({ "responses": dataBot.data.responses }); }) .catch((error) => { console.error(error); res.status(500).json(error); }) }); // 测试GET路由,最终访问路径为 /strapiClient/falauser router.get('/', function (req, res) { res.json({ fruta: 'lichia' }); }); - 检查前端请求代码,确保POST请求地址写为
/strapiClient/falauser,不要写错路径层级。
验证步骤
改完配置后按顺序校验:
- 访问任意静态资源路径,比如
/strapiClient/css/[项目内实际存在的css文件名],确认不需要通配符也能正常加载 - 访问测试GET地址
/strapiClient/falauser,确认能正常返回{"fruta":"lichia"}的JSON响应 - 在聊天框触发POST请求,确认不再返回404,JSON解析错误同步消失
内容的提问来源于stack exchange,提问作者LuizC
相关产品推荐
相关产品推荐

