elasticsearch-js的坑爹问题
作者描述 https://github.com/elasticsearch/elasticsearch-js/issues/33
自已封装的定时任务框架https://github.com/cclient/typescriptjob,长期以来稳定运行。
这次线上部署,每个单独任务功能项执行成功,单元测试通过。
但当整个集成服务部署执行时,部分定时任务,第一次调用成功,再下一次触发时直接失败,没 catch 到任何异常
仔细排查,定位定位到了抛异常的地方,万万没想到是getESConnection 这个方法报错
const elasticsearch = require("elasticsearch"); function getESConnection(conf) { let client = new elasticsearch.Client(conf); return client; } exports.getESConnection = getESConnection;
error Error: Do not reuse objects to configure the elasticsearch Client class: https://github.com/elasticsearch/elasticsearch-js/issues/33
new elasticsearch.Client(conf);
第一执行时成功,第二次调用,因为传入同样的 conf,Client内部会比对,第二次的 conf和第一次相同,就直接异常了???简直滑稽
作者的意思是,相同的配置构造的是相同的 Client 对象,是原始项的冗余拷贝,是反模式,就直接弹错误。
有人建议作者在构造时Client 时,检查conf,碰到同样的配置,内部返回单例,而不是报个错
优化层面的东西,本来就是仁者见仁,智者见智,弹个warn就够了,至于直接抛异常么,太不友好
https://github.com/elastic/elasticsearch-js/issues/33
es的文档后来也补充
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/configuration.html
还是觉得这种设计太反人类了,相同的 conf 配置,至少不会有什么副作用,最多弹个 warn。但用别人的东西,只能迁就他