通过Kong访问NestJS时POST请求Content-Type被替换问题
问题根源与解决方案
- 问题不在Kong,而是你请求里的
mode: "no-cors"导致浏览器主动修改了Content-Type - 浏览器在
no-cors模式下,仅允许发送简单请求头,其中Content-Type只能是application/x-www-form-urlencoded、multipart/form-data或text/plain。你设置的application/json不属于简单请求头范畴,浏览器会自动将其替换为text/plain;charset=UTF-8,Kong只是原样转发了这个被浏览器修改后的请求头。
解决步骤
1. 移除请求中的mode: "no-cors"
修改你的fetch代码:
fetch(`${API_URL}${MESSAGE_API_PATH}`, { method: "POST", headers: { "Content-Type": "application/json;charset=UTF-8", Accept: "application/json;charset=UTF-8", }, body: JSON.stringify({ foo: "Hello world" }), })
2. 配置跨域支持(CORS)
移除no-cors后,需要确保服务端允许跨域请求:
- NestJS应用配置CORS:在main.ts中启用CORS
async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors({ origin: "你的前端域名", // 示例:"http://localhost:3000" allowedHeaders: ["Content-Type", "Accept"], methods: ["POST", "GET", "OPTIONS"] }); await app.listen(3000); } bootstrap();
- Kong网关配置CORS插件:给对应的路由或服务添加CORS插件,允许前端域名的跨域请求,配置示例:
# 给目标服务添加CORS插件 curl -X POST http://kong-admin:8001/services/your-service-name/plugins \ -d name=cors \ -d config.origins=你的前端域名 \ -d config.credentials=true \ -d config.allowed_headers="Content-Type,Accept" \ -d config.allowed_methods="POST,GET,OPTIONS"
这样修改后,浏览器会保留你设置的application/json请求头,Kong就能正确转发到NestJS应用,满足接口的Content-Type要求。
内容的提问来源于stack exchange,提问作者Yanick Rochon
相关产品推荐
相关产品推荐

