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

Nextjs POST请求遇CORS错误,GET及Postman请求正常

Next.js 13 API POST请求CORS错误解决方案

问题根源

你的POST请求触发了浏览器的预检OPTIONS请求,但当前API路由没有处理这个请求类型,导致预检响应里没有返回你设置的CORS头,浏览器直接拦截了后续的POST请求。GET请求不需要触发预检,所以能正常工作。

解决方案

方案1:在API路由中显式处理OPTIONS请求

修改你的API路由文件,先判断请求方法,如果是OPTIONS,直接返回带CORS头的响应;如果是其他方法(GET/POST等),再执行原有业务逻辑:

export default async function handler(req, res) {
  // 处理OPTIONS预检请求
  if (req.method === 'OPTIONS') {
    res.headers.append("Access-Control-Allow-Origin", req.headers.get('origin'));
    res.headers.append("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE");
    res.headers.append("Access-Control-Allow-Headers", "Content-Type");
    return res.status(200).end();
  }

  // 处理GET/POST等业务逻辑
  if (req.method === 'GET') {
    // 原有GET逻辑
    res.headers.append("content-type", "application/json");
    res.headers.append("Access-Control-Allow-Origin", req.headers.get('origin'));
    res.status(200).json({ message: 'GET success' });
  } else if (req.method === 'POST') {
    // 原有POST逻辑
    res.headers.append("content-type", "application/json");
    res.headers.append("Access-Control-Allow-Origin", req.headers.get('origin'));
    // 处理POST数据
    res.status(201).json({ message: 'POST success' });
  } else {
    res.setHeader('Allow', ['GET', 'POST', 'OPTIONS']);
    res.status(405).end(`Method ${req.method} Not Allowed`);
  }
}

方案2:使用cors库简化配置

安装官方推荐的cors包,减少手动配置的繁琐:

npm install cors
# 或者
yarn add cors

然后在API路由中引入并使用:

import Cors from 'cors';

// 初始化cors中间件
const cors = Cors({
  origin: req => req.headers.get('origin'), // 允许请求来源的origin
  methods: ['GET', 'POST', 'PATCH', 'DELETE'],
  allowedHeaders: ['Content-Type'],
});

// 辅助函数:执行中间件
function runMiddleware(req, res, fn) {
  return new Promise((resolve, reject) => {
    fn(req, res, (result) => {
      if (result instanceof Error) {
        return reject(result);
      }
      return resolve(result);
    });
  });
}

export default async function handler(req, res) {
  // 先执行cors中间件
  await runMiddleware(req, res, cors);

  // 后续业务逻辑
  if (req.method === 'POST') {
    // 处理POST请求
    res.status(201).json({ message: 'POST success' });
  } else if (req.method === 'GET') {
    // 处理GET请求
    res.status(200).json({ message: 'GET success' });
  } else {
    res.setHeader('Allow', ['GET', 'POST']);
    res.status(405).end(`Method ${req.method} Not Allowed`);
  }
}

验证要点

  • 确认req.headers.get('origin')能正确获取到http://localhost:5173,如果为空可以临时写死"http://localhost:5173"测试(生产环境不建议)。
  • 检查axios请求是否携带Content-Type: application/json头,这是触发预检的常见原因,确保你的CORS配置里允许了这个头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:38:07