Nuxt3 $fetch如何移除Content-Type中text/plain;charset=UTF-8
异常原因
这个现象是$fetch(即ofetch,底层依赖undici发起请求)的头信息合并逻辑bug导致的:
- 当你直接给
body参数传入普通JavaScript对象时,ofetch会自动触发JSON序列化逻辑,同时undici内部会先给未显式标记类型的请求体设置默认值text/plain;charset=UTF-8 - 后续ofetch合并用户手动传入的请求头时,没有做同名头的覆盖处理,反而会把默认值和你手动设置的
application/json用逗号做拼接,最终出现请求头里两个Content-Type值共存的情况。
这个问题可解决,不需要修改底层依赖,以下两种方案都可以完全移除多余的Content-Type片段:
可行解决方案
- 方案1:提前序列化请求体,绕过自动头注入
不要直接把JS对象传给body,提前用JSON.stringify把对象转成JSON字符串再传入。这种场景下ofetch不会触发自动对象序列化逻辑,也不会注入默认的text/plain头,会完全使用你手动设置的Content-Type: application/json。
修正后的代码:const data = await $fetch('http://http-logger:3001/rpc/test_proc', { method: 'post', headers: { Prefer: 'params=single-object', Accept: 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({some: 'json'}) }) - 方案2:移除手动设置的Content-Type,让ofetch自动注入正确头
当传入对象类型body时,显式声明请求/响应类型为json,ofetch会自动设置正确的application/json头,不会追加text/plain片段,也不需要手动传Content-Type头。
修正后的代码:const data = await $fetch('http://http-logger:3001/rpc/test_proc', { method: 'post', headers: { Prefer: 'params=single-object', Accept: 'application/json' }, body: {some: 'json'}, responseType: 'json' })
验证:两种方案调整后抓包,Content-Type会固定为
application/json,不会再出现拼接的多余片段,PostgREST可以正常识别参数调用存储过程。
内容的提问来源于stack exchange,提问作者ianj
相关产品推荐
相关产品推荐

