本文首发在我的个人博客:你写的 Express 接口 404,可能是被“动态路由”吃掉了

前情提要

最近参与公司的一个项目前端 React,后端用的 Express。目前我就做一些功能的新增或者修改。

对于 Express ,本人没有公司项目实战经验,个人经验也仅限于刚开始搭建个人第一版博客时使用过。

所以对于 Express ,属于使用过,但还没入门。

遇到问题

项目中有如下代码,我新增了 uploadGroupMemberCSVexportToCSV 两个方法

const router = require('express').Router()
...
const uploadGroupMemberCSV = async (req,res) => {};
const exportToCSV = async (req, res) => {}
...router.get("/group-member",[requireRoles(), checkRoles("admin", "owner", "moderator")],getAllGroupsMembers
);
router.get("/group-member/:id",[requireRoles(), checkRoles("admin", "owner", "moderator")],getSingleGroupMember
);
router.put("/group-member/:id",[requireRoles(), checkRoles("admin", "owner", "moderator")],updateGroupMember
);
router.delete("/group-member/delete/:id",[requireRoles(), checkRoles("admin", "owner")],deleteGroupMember
);router.post("/group-member/upload-csv",[requireRoles(), checkRoles("admin", "owner", "moderator"),upload.single('file'), ],uploadGroupMemberCSV
);
router.get("/group-member/exportToCSV",[requireRoles(), checkRoles("admin", "owner", "moderator")],exportToCSV
);
module.exports = router;

当我在前端调用 /group-member/exportToCSV 接口时,会报 404 的错误。

看到 404 ,开始以为接口名字写错了,排查了半天都没发现问题。

结果查看接口返回,居然有错误信息返回? 拿着错误信息在后端代码中去查找,发现错误信息是 updateGroupMemberdeleteGroupMembergetSingleGroupMember 这三个接口中某一个返回的错误信息(其他接口没做查询不到数据就抛出异常,所以可能直接跳过了)

奇怪,我没有调这几个接口,怎么就返回他们的错误信息了呢?难道和代码写的顺序有关?

尝试调整代码位置后就正常了。。。

// 调整后的代码
const router = require('express').Router()
...
const uploadGroupMemberCSV = async (req,res) => {};
const exportToCSV = async (req, res) => {}
...router.get("/group-member",[requireRoles(), checkRoles("admin", "owner", "moderator")],getAllGroupsMembers
);
router.post("/group-member/upload-csv",[requireRoles(), checkRoles("admin", "owner", "moderator"),upload.single('file'), ],uploadGroupMemberCSV
);// ===> 顺序调整到前面来了router.get("/group-member/exportToCSV",[requireRoles(), checkRoles("admin", "owner", "moderator")],exportToCSV
);
router.get("/group-member/:id",[requireRoles(), checkRoles("admin", "owner", "moderator")],getSingleGroupMember
);
router.put("/group-member/:id",[requireRoles(), checkRoles("admin", "owner", "moderator")],updateGroupMember
);
router.delete("/group-member/delete/:id",[requireRoles(), checkRoles("admin", "owner")],deleteGroupMember
);module.exports = router;

最后

问了下 ChatGPT,好像 JAVA 等传统语言也存在路由优先级的问题?

所以我开始遇到的问题就是写在前面的 get 方法的 /group-member/:id 吞掉了我写在后面同样是 get 方法的 /group-member/exportToCSV 接口。

建议:

  • 静态路由写在前面,动态路由写在后面

作为初次写后端的前端,还有许多坑需要踩的。

感谢你的阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912034.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912034.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912034.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java面试】你是怎么控制缓存的更新?

🔄 一、数据实时同步失效(强一致性) 原理:数据库变更后立即失效或更新缓存,保证数据强一致。 实现方式: Cache Aside(旁路缓存): 读流程:读缓存 → 未命中则…

react-嵌套路由 二级路由

什么是嵌套路由? 在一级路由中又内嵌了其他路由,这种关系就叫做嵌套路由,嵌套至一级路由内的路由又称作二级路由 嵌套路由配置 实现步骤 配置二级路由 children嵌套 import Login from "../page/Login/index"; import Home from …

【CMake基础入门教程】第八课:构建并导出可复用的 CMake 库(支持 find_package() 查找)

很好!我们进入 第八课:构建并导出可复用的 CMake 库(支持 find_package() 查找)。 🎯 本课目标 你将掌握: 如何构建一个库并通过 install() 导出其配置; 如何让别人在项目中使用 find_package…

Jenkins与Kubernetes深度整合实践

采用的非jenkins-slave方式 jenkins配置: Jenkins添加k8s master节点的服务器信息 在Jenkins容器内部与k8s master节点设置免费登录 # docker过滤查询出运行的Jenkins服务 $ docker ps | grep jenkins# 进入Jenkins容器内部 $ docker exec -it jenkins-server /bi…

GraphQL API-1

简介 判断GraphQL方式 判断一个网站是否使用了GraphQL API,可以通过以下几种方法: 1. 检查网络请求 查看请求端点 GraphQL 通常使用单一端点,常见路径如: /graphql/api/graphql/gql/query 观察请求特征 POST 请求为主&…

推荐C++题目练习网站

LeetCode LeetCode是一个全球知名的编程练习平台,提供大量C题目,涵盖数据结构、算法、系统设计等。题目难度从简单到困难,适合不同水平的学习者。平台支持在线编写代码并即时运行测试,提供详细的题目讨论区和官方解答。 Codeforc…

Spring Cloud 微服务(服务注册与发现原理深度解析)

📌 摘要 在微服务架构中,服务注册与发现是整个系统运行的基础核心模块。它决定了服务如何被定位、调用和管理。 本文将深入讲解 Spring Cloud 中 Eureka 的服务注册与发现机制,从底层原理到源码分析,再到实际开发中的最佳实践&a…

【Linux 设备模型框架 kobject 和 kset】

Linux 设备模型框架 kobject 和 kset 一、Linux 设备模型概述二、kobject 与 kset 的核心概念1. kobject2. kset3. 关键数据结构 三、kobject 与 kset 的实现源码四、源码解析与使用说明1. kset 的创建与初始化2. kobject 的创建与属性3. sysfs 属性操作4. 用户空间访问示例 五…

一起学前端之HTML------(1)HTML 介绍

HTML 介绍 HTML 即超文本标记语言(HyperText Markup Language),它是构成网页的基础技术之一。HTML 借助各种标签(Tag)对网页的结构与内容加以描述。下面为你介绍其核心要点: 关键特性 标签结构&#xff…

整体迁移法迁移 Docker 镜像

docker添加了新的镜像数据盘,数据盘迁移步骤 使用整体迁移法迁移 Docker 镜像后,可以在确认迁移成功且新数据盘正常使用后,删除旧数据目录来释放空间1。 # 停止 Docker 服务 sudo systemctl stop docker # 停止 socket 监听器 sudo systemct…

智能IDE+高效数据采集,让数据获取接近0门槛

亮数据也有了自己的官方账号,大家可以关注:https://brightdata.blog.csdn.net/ 现在正有福利,有兴趣的伙伴可以访问链接: https://www.bright.cn/products/web-scraper/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_jhx…

GNSS位移监测站在大坝安全中的用处

一、实时监测大坝变形 整体位移监测 GNSS(全球导航卫星系统)位移监测站能够实时、连续地获取大坝在三维空间中的位置信息,包括水平位移和垂直位移。大坝在长期运行过程中,受到水压力、温度变化、地基沉降等多种因素的影响&#x…

数字图像处理(一):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么

数字图像处理(一) 一、什么是图像:图像就是多维数组图像的存储每一个格子有自己的颜色、深浅如何访问图像:1.对于RGB图像,共有R/G/B三个通道,通过代码来看。图像有单通道和多通道之分,访问时只需…

关于汉语和英语哪个更先进、历史更久的争论

引言:热议背后的思考​ ​ 在全球化浪潮的推动下,英语作为国际通用语言,在世界范围内广泛传播,其在国际商务、科技交流、学术研究等领域占据着重要地位。而汉语,作为世界上使用人口最多的语言之一,承载着…

在不联网的情况下,从可以联网的计算机上拷贝过来的程序报错:nu1301 无法加载源,https://api.nuget.org/v3/index.json

解决方法: 在联网的计算机上,找到nuget文件,拷贝到,不能联网的计算机的相应位置 设置加载这个nuget包,把nuget.org取消。 注意如果出现好多包都不能加载,可能是框架版本的问题,修改框架版本&am…

TCP 状态流程及原理详解:从连接建立到性能优化

一、TCP 协议概述与核心价值 TCP(Transmission Control Protocol,传输控制协议)是互联网协议栈中的核心协议之一,为网络通信提供可靠的、面向连接的数据传输服务。在当今复杂多变的网络环境中,深入理解 TCP 协议的状态…

【STM32 学习笔记】PWR电源控制

在电子设备中,待机(Standby)和睡眠(Sleep)是两种不同的省电模式。 1. 待机模式(Standby Mode):在待机模式下,设备仍然保持一定程度的活动,但大部分功能处于暂…

TCP 重传机制详解:原理、变体与故障排查应用

一、TCP 重传机制基础原理 1.1 可靠传输的核心保障 TCP(Transmission Control Protocol,传输控制协议)作为互联网中最常用的传输层协议,其核心特性之一是提供可靠的数据传输服务。在不可靠的网络环境中,数据包可能会…

Linux-HTTP服务和APACHE-学习笔记

序 欠10年前自己的一份笔记,献给今后的自己。 Internet Internet与中国 Internet最早来源于美国国防部高级研究计划局ARPA建立的ARPANet,1969年投入运行。1983年,ARPAnet分裂为两部分:ARPAnet和纯军事用的MILNET。当年1月&…

GitHub 趋势日报 (2025年06月26日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 716 free-for-dev 677 Self-Hosting-Guide 618 Best-websites-a-programmer-shoul…