You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Node.js的GET路由置于POST路由内引发404错误的解决方法

问题分析与解决方案

你遇到的404错误核心原因是把app.get路由注册放在了app.post的回调函数内部,Express的路由规则是在服务器启动阶段完成注册的,而非请求触发时动态添加。这会导致:

  • 第一次发送GET请求时,该路由还未注册,直接返回404
  • 每次触发POST请求都会重复注册同一个GET路由,后续会引发路由冲突

另外你的代码还有冗余问题:

  • 重复添加了bodyParser.json()中间件
  • POST回调里重复添加了CORS中间件,完全没必要

正确实现思路

  1. 把GET路由单独放在POST路由外部,提前完成注册
  2. 用全局变量(生产环境建议用数据库)存储POST请求中获取的fetchResponse数据,让GET路由可以读取并返回
  3. 移除冗余的重复中间件

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:50:11