Elasticsearch Fetch请求报错Content-Type不支持问题求助
问题分析与解决办法
嘿,我来帮你拆解下这个问题,其实核心原因很简单,咱们一步步来:
1. 导致报错的直接原因:请求头配置拼写错误
你在myInit里写的是header,但Fetch API的配置项里请求头的正确键名是复数的headers!这个拼写错误直接导致你设置的Content-Type: application/json根本没有被浏览器识别,浏览器自动用了默认的text/plain;charset=UTF-8来发送请求体。
而Elasticsearch对POST请求的要求很明确:请求体必须是application/json格式,所以它直接返回了不支持该Content-Type的报错。
另外还要注意:Access-Control-Allow-Origin是服务器端返回给浏览器的响应头,不是前端请求里需要携带的头,你把它写在请求头里完全没用,直接删掉就好。
修正后的请求头配置应该是这样:
headers: { "Content-Type": "application/json" },
2. 确认Elasticsearch的CORS配置完整性
你已经开了CORS,但为了避免其他潜在问题,建议把elasticsearch.yml里的CORS配置补全:
http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, Authorization"
修改完配置后一定要重启Elasticsearch服务,否则新配置不会生效。
3. 检查请求体的语法正确性
你代码里的{ "match" : {[searchDSL]: x} }用到了ES6的计算属性名,要确保searchDSL变量的值是合法的字段名(比如"fields.title"或者"title"),同时x是正确的搜索字符串,避免出现JSON格式错误。
修正后的完整Fetch请求示例
const source = "http://localhost:9200/movies2/_search"; const searchDSL = "fields.title"; // 替换成你实际要搜索的字段 const x = "Lord"; // 替换成你的搜索关键词 var myInit = { method: 'POST', mode: 'cors', cache: 'default', headers: { "Content-Type": "application/json" }, body: JSON.stringify({ "query": { "match": { [searchDSL]: x } } }) }; try { let reqLite = await fetch(source, myInit); const data = await reqLite.json(); console.log(data); } catch (err) { console.error('请求失败:', err); }
内容的提问来源于stack exchange,提问作者orazur
相关产品推荐
相关产品推荐

