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

Vercel部署React+Node.js API遇405错误:本地正常线上失效求助

Vercel部署React+Node.js API 405错误解决方法

问题背景

用React+Node.js在Vercel搭建网站,本地开发时前端跑3000端口、Node服务跑3001端口,调用http://localhost:3001/api/check-eligibility的POST请求完全正常,但部署到Vercel后,不管用相对路径/api/check-eligibility还是硬编码线上URL,都返回405 (Method Not Allowed),用Postman测试所有可能路径也都报错。

原项目结构:

  • API代码放在server目录,用Express搭建服务,路由定义在server/routes/eligibilityRoutes.js,package.json配置了"proxy": "http://localhost:3001"

核心原因

Vercel不支持部署完整的长期运行Express服务器,而是采用Serverless Functions模式:每个API请求会触发一个临时函数实例,必须按照Vercel指定的目录结构放置API代码,否则平台无法识别路由,导致请求找不到对应端点,返回405错误。

解决步骤

1. 迁移API代码到Vercel指定目录

在项目根目录创建/api文件夹,新建/api/check-eligibility.js文件,把原有的业务逻辑迁移过来,按照Vercel Serverless Functions格式编写:

require('dotenv').config();
const { checkEligibility } = require('../server/controllers/eligibilityController');
const cors = require('cors');

// 处理CORS
const corsMiddleware = cors({ origin: true });

module.exports = async (req, res) => {
  corsMiddleware(req, res, async () => {
    // 只允许POST方法
    if (req.method !== 'POST') {
      return res.status(405).json({ error: '仅支持POST请求' });
    }
    try {
      // 调用原有的controller处理逻辑
      await checkEligibility(req, res);
    } catch (err) {
      res.status(500).json({ error: err.message });
    }
  });
};

2. 保留本地开发的Express服务(可选)

原有的server/server.js和路由文件可以继续保留,用于本地开发测试。本地启动3001端口服务后,package.json的proxy配置会自动把前端的/api/*请求转发到3001端口,不影响本地开发体验。

3. 前端请求代码无需修改

前端的fetch请求保持相对路径即可:

const checkEligibility = async () => {
  try {
    const response = await fetch('/api/check-eligibility', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ stateRegion, sectorOption }),
    });
    const jsonResponse = await response.json();
    setResponseData(jsonResponse);
    console.log(jsonResponse);
  } catch (error) {
    console.error('获取数据出错:', error);
  }
};

4. 自定义Vercel路由(可选)

如果需要调整路由规则,在项目根目录创建vercel.json文件,确保API路由被正确识别:

{
  "rewrites": [
    { "source": "/api/(.*)", "destination": "/api/$1" }
  ]
}

5. 测试线上环境

部署到Vercel后,直接通过前端页面触发请求,或者用Postman发送POST请求到https://你的域名/api/check-eligibility,验证是否正常返回数据。

额外提示

可以使用Vercel CLI的vercel dev命令在本地模拟线上环境,让本地测试行为和线上完全一致,避免部署后出现差异。

内容的提问来源于stack exchange,提问作者James L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:06:06