MidwayJS从v2升级到v3后无法连接Elasticsearch报错ProductNotSupportedError
MidwayJS v3升级后Elasticsearch连接异常排查方案
问题根源
ProductNotSupportedError是Elasticsearch 7.x客户端的内置校验机制:客户端会强制检查服务器返回的X-Elastic-Product响应头是否为Elasticsearch,一旦缺失或不匹配就会抛出该错误。结合Midway从v2升级到v3的场景,问题本质是客户端未接收到符合预期的ES服务响应,重点从以下方向排查:
排查与修复步骤
1. 校验egg-elasticsearch-ts插件适配性
你使用的egg-elasticsearch-ts@1.1.1版本较早,大概率未适配Egg 3.x(MidwayJS v3基于Egg 3),插件内部的请求逻辑在新版框架下可能出现异常,导致ES客户端无法正确获取响应头。
- 修复方式:
- 升级
egg-elasticsearch-ts至最新版本,查看是否支持Egg 3/Midway 3; - 若插件无更新,弃用第三方插件,直接在Midway中初始化官方ES客户端:
// 配置文件 src/config/config.default.ts export default () => ({ elasticsearch: { node: 'http://your-es-host:9200', auth: { username: 'your-username', password: 'your-password' } } }); // 服务文件 src/service/elasticsearch.service.ts import { Provide, Config, Init } from '@midwayjs/core'; import { Client } from '@elastic/elasticsearch'; @Provide() export class ElasticsearchService { private client: Client; @Config('elasticsearch') private esConfig; @Init() async initClient() { this.client = new Client(this.esConfig); // 测试连接有效性 await this.client.ping({ requestTimeout: 5000 }); } // 封装业务用到的ES操作方法 async search(index: string, query: object) { return this.client.search({ index, body: query }); } }
- 升级
2. 验证ES服务的响应头
用curl直接请求ES服务,确认响应头包含X-Elastic-Product: Elasticsearch:
curl -I http://your-es-host:9200
- 如果无该响应头:
- 若ES服务器版本低于7.0,需升级ES至7.x版本(与客户端7.12匹配);
- 若存在反向代理/网关,需配置代理透传
X-Elastic-Product响应头; - 若使用的是非官方ES衍生产品(如OpenSearch),需在客户端添加强制头绕过校验:
const client = new Client({ node: 'http://your-es-host:9200', headers: { 'X-Elastic-Product': 'Elasticsearch' // 强制设置请求头,绕过客户端校验 } });
3. 检查Midway全局拦截逻辑
MidwayJS v3可能调整了底层中间件或拦截器逻辑,确认项目中是否存在全局请求/响应拦截器,是否篡改了ES请求的响应头或响应体,如有则需排除ES相关请求的拦截规则。
4. 核对版本兼容性
确保Elasticsearch服务器版本与@elastic/elasticsearch@7.12.0的兼容性:建议服务器版本与客户端版本保持一致,或仅存在小版本差异(如客户端7.12对应服务器7.10~7.14),跨大版本(如7.x客户端连6.x服务器)会触发兼容性校验错误。
内容的提问来源于stack exchange,提问作者Lakshay
相关产品推荐
相关产品推荐

