将Node.js的GET路由置于POST路由内引发404错误的解决方法
问题分析与解决方案
你遇到的404错误核心原因是把app.get路由注册放在了app.post的回调函数内部,Express的路由规则是在服务器启动阶段完成注册的,而非请求触发时动态添加。这会导致:
- 第一次发送GET请求时,该路由还未注册,直接返回404
- 每次触发POST请求都会重复注册同一个GET路由,后续会引发路由冲突
另外你的代码还有冗余问题:
- 重复添加了
bodyParser.json()中间件 - POST回调里重复添加了CORS中间件,完全没必要
正确实现思路
- 把GET路由单独放在POST路由外部,提前完成注册
- 用全局变量(生产环境建议用数据库)存储POST请求中获取的
fetchResponse数据,让GET路由可以读取并返回 - 移除冗余的重复中间件
修正后的代码
const express = require('express'); const app = express(); // 仅需一次JSON解析配置(Express 4.16+内置该功能,无需单独安装bodyParser) app.use(express.json()); // 仅需一次CORS配置 app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); next(); }); // 用全局变量存储卡片数据(生产环境建议替换为数据库) let cardData = null; app.post("/", async (req, res) => { const { cardHolder, balance } = req.body; console.log(cardHolder, balance); // Flutterwave卡片创建参数 const payload = { "currency": "USD", "amount": balance, "billing_name": cardHolder, "billing_address": "2014 Forest Hills Drive", "billing_city": "React", "billing_state": "NY", "billing_postal_code": "000009", "billing_country": "US", }; try { const createCardResponse = await flw.VirtualCard.create(payload); const newPayload = { "id": createCardResponse.data.id }; const fetchResponse = await flw.VirtualCard.fetch(newPayload); console.log(fetchResponse); // 将获取到的数据存入全局变量 cardData = fetchResponse; // 给POST请求返回成功响应 res.status(200).json({ message: "卡片创建并获取成功" }); } catch (err) { // 捕获并返回错误 console.error(err); res.status(500).json({ error: "操作失败" }); } }); // 单独注册GET路由,读取存储的数据返回 app.get('/', async (req, res) => { if (!cardData) { return res.status(404).json({ message: "暂无卡片数据,请先发送POST请求创建卡片" }); } res.send(cardData); }); app.listen(5000, () => {console.log("Server started on port 5000")});
补充说明
- 多用户场景下,全局变量会导致数据互相覆盖,需改用数据库存储,通过用户标识(如用户ID)区分数据
- 必须给异步请求添加错误捕获,避免服务器崩溃或请求超时
- Express 4.16.0及以上版本内置
express.json(),可替代bodyParser.json(),无需额外安装依赖
内容的提问来源于stack exchange,提问作者Jojo Amankwa
相关产品推荐
相关产品推荐

