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

Fastify框架POST接口CORS跨域错误排查求助

解决Fastify中POST接口OPTIONS预请求CORS错误的方案

问题根源

你的GET接口正常是因为它属于简单请求,不需要发送OPTIONS预请求,直接应用了@fastify/cors配置的Access-Control-Allow-Origin头;而POST接口触发了OPTIONS预请求,这个预请求没有被你的CORS配置正确处理,导致返回了默认的*,和credentials: true冲突引发错误。

具体解决步骤

1. 确保CORS插件在所有路由之前注册

Fastify的插件和路由注册是按顺序执行的,如果你的路由(尤其是/api/v1/create-user)在@fastify/cors插件注册之前定义,对应的OPTIONS预请求会绕过CORS配置,使用默认的通配符*。调整代码顺序:

import Fastify, { FastifyInstance, FastifyServerOptions } from 'fastify';
import cors from '@fastify/cors';

const fastify = Fastify({ /* 你的服务器配置 */ });

// 先注册CORS插件,再注册所有路由
fastify.register(cors, {
   origin: "https://dev.example.com",
   credentials: true,
});

// 然后注册你的路由
fastify.get('/api/v1/users', async (request, reply) => {
  // 接口逻辑
});

fastify.post('/api/v1/create-user', async (request, reply) => {
  // 接口逻辑
});

// 启动服务器
fastify.listen({ port: 3000 }, (err) => {
  if (err) throw err;
});

2. 显式指定允许的方法(可选)

如果上述调整后仍有问题,可以在CORS配置中显式列出允许的HTTP方法,确保OPTIONS预请求能正确匹配:

fastify.register(cors, {
   origin: "https://dev.example.com",
   credentials: true,
   methods: ['GET', 'POST', 'OPTIONS'] // 包含OPTIONS方法
});

3. 使用动态Origin函数(兜底方案)

如果你的环境需要更灵活的Origin匹配,改用函数形式返回Origin,确保预请求也能正确获取到对应的值:

fastify.register(cors, {
  origin: (origin, cb) => {
    // 只允许指定的Origin
    if (origin === "https://dev.example.com") {
      cb(null, true);
      return;
    }
    cb(new Error('Not allowed by CORS'));
  },
  credentials: true
});

验证方法

发送OPTIONS请求到https://api-dev.example.com/api/v1/create-user,检查响应头的Access-Control-Allow-Origin是否为https://dev.example.com,而不是*。

内容的提问来源于stack exchange,提问作者Not A Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:03:26