【求助】接入支持 search 接口能力的 cnpmcore 版本遇到了问题
- 背景:通过 cnpmcore 包集成方式来引入 3.43.4 版本的,先前使用 3.42.x 版本是正常的。
- 一些可能有关联的信息如下
- node: 18.17.1
- typescript:
- 依赖
"dependencies": {
"@aws-sdk/client-s3": "^3.328.0",
"@eggjs/tegg": "^3.19.0",
"@eggjs/tegg-config": "^3.19.0",
"@eggjs/tegg-controller-plugin": "^3.19.0",
"@eggjs/tegg-lifecycle": "^3.19.0",
"@eggjs/tegg-plugin": "^3.19.0",
"@eggjs/tsconfig": "^1.3.3",
"@elastic/elasticsearch": "^8.9.0",
"cnpmcore": "3.43.4",
"egg": "^3.17.4",
"egg-scripts": "^2.17.0",
"eggjs-elasticsearch": "^0.0.6"
},
"devDependencies": {
"@types/mocha": "^10.0.1",
"@types/node": "^20.5.9",
"egg-bin": "^6.4.2",
"egg-mock": "^5.10.8",
"eslint": "^8.30.0",
"eslint-config-egg": "^12.2.1",
"typescript": "^5.1.3"
},
- 插件配置 config/plugin.ts
import { EggPlugin } from "egg";
const plugin: EggPlugin = {
tegg: {
enable: true,
package: "@eggjs/tegg-plugin",
},
teggConfig: {
enable: true,
package: "@eggjs/tegg-config",
},
teggController: {
enable: true,
package: "@eggjs/tegg-controller-plugin",
},
teggSchedule: {
enable: true,
package: "@eggjs/tegg-schedule-plugin",
},
teggOrm: {
enable: true,
package: "@eggjs/tegg-orm-plugin",
},
eventbusModule: {
enable: true,
package: "@eggjs/tegg-eventbus-plugin",
},
aopModule: {
enable: true,
package: "@eggjs/tegg-aop-plugin",
},
view: {
enable: true,
},
nunjucks: {
enable: true,
package: "egg-view-nunjucks",
},
tracer: {
enable: true,
package: "egg-tracer",
},
typeboxValidate: {
enable: true,
package: "egg-typebox-validate",
},
redis: {
enable: true,
package: "egg-redis",
},
cors: {
enable: true,
package: "egg-cors",
},
elasticsearch: {
enable: true,
package: "eggjs-elasticsearch",
},
};
export default plugin;
- /app/infra/SearchAdapter.ts
import { AccessLevel, SingletonProto } from "@eggjs/tegg";
import { ESSearchAdapter } from "cnpmcore/infra/SearchAdapter";
/**
* Use elasticsearch to search the huge npm packages.
*/
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,
name: "searchAdapter",
})
export class MyESSearchAdapter extends ESSearchAdapter {}
我也尝试了将 cnpmcore 中 SearchAdapter 的实现代码搬到集成的应用中来,遇到的报错是一样的,也就是下面截图中的,有大佬能帮忙看一下造成原因可能是什么吗?
尝试了直接在cnpmcore项目里同样的配置是可以正常正常启动的。但是到了应用集成 cnpmcore 包的时候就不行了,像是 cnpmcore 里 app/infra/SearchAdapter.ts 里的 ESClient 注入没生效
你将 elasticsearch 插件关闭
import {
AccessLevel,
SingletonProto,
} from '@eggjs/tegg';
import { SearchAdapter } from 'cnpmcore/common/typing';
/**
* Use elasticsearch to search the huge npm packages.
*/
@SingletonProto({
accessLevel: AccessLevel.PUBLIC,
name: 'searchAdapter',
})
export class ESSearchAdapter implements SearchAdapter {
search(): Promise<any> {
throw new Error('Method not implemented.');
}
upsert(): Promise<string> {
throw new Error('Method not implemented.');
}
delete(): Promise<string> {
throw new Error('Method not implemented.');
}
}
@baxtergu 试试这个?
我想要在应用集成cnpmcore包的基础上启用 elasticsearch 的搜索能力现在有法子吗?
你将 elasticsearch 插件关闭
我试了应用集成方式,开关项关掉还是抛错。
import { AccessLevel, SingletonProto, } from '@eggjs/tegg'; import { SearchAdapter } from 'cnpmcore/common/typing'; /** * Use elasticsearch to search the huge npm packages. */ @SingletonProto({ accessLevel: AccessLevel.PUBLIC, name: 'searchAdapter', }) export class ESSearchAdapter implements SearchAdapter { search(): Promise<any> { throw new Error('Method not implemented.'); } upsert(): Promise<string> { throw new Error('Method not implemented.'); } delete(): Promise<string> { throw new Error('Method not implemented.'); } }@baxtergu 试试这个?
其实我还是想要在应用集成的场景下启用这个能力,这个解决方案类似禁用该能力...😮💨
其实我还是想要在应用集成的场景下启用这个能力,这个解决方案类似禁用该能力...😮💨
我在本地没能重现出报错 看贴的示例代码,还要配置一下 node 节点,在应用的 config.default.ts 中添加
config.elasticsearch = {
client: {
node: "http://localhost:9200"
}
};
https://github.com/elrrrrrrr/examples/blob/with-cnpmcore/hello-tegg/config/config.default.ts#L94
@baxtergu 这是我的验证分支 可以对比看看本地执行是否正常,在 hello-tegg 目录执行 tnpm run dev
curl 'http://localhost:7001/-/v1/search?text=banana'
由于没有实际配置 node,会提示 error,但是应用启动应该都是正常的
其实我还是想要在应用集成的场景下启用这个能力,这个解决方案类似禁用该能力...😮💨
我在本地没能重现出报错 看贴的示例代码,还要配置一下 node 节点,在应用的 config.default.ts 中添加
config.elasticsearch = { client: { node: "http://localhost:9200" } };
我在配置文件中指定过这个部分了,如果不提供这个部分的话报错信息是这个 elasticsearch config node is required https://github.com/Beace/eggjs-elasticsearch/blob/971e98ad39f1e0fac365ef70ac6754c5f221a2df/impl/elasticsearch.ts#L10
我明天再试试其他法子看看能不能绕过这个错,参考之前 s3-cnpmcore 的实现方式
我用的包管理器是 yarn 1.x 的 latest,我明天试试直接用 npm 排除一下
https://github.com/elrrrrrrr/examples/blob/with-cnpmcore/hello-tegg/config/config.default.ts#L94
@baxtergu 这是我的验证分支 可以对比看看本地执行是否正常,在
hello-tegg目录执行tnpm run devcurl 'http://localhost:7001/-/v1/search?text=banana'
由于没有实际配置 node,会提示 error,但是应用启动应该都是正常的
感谢,我明天也试试这个 demo 在我的环境中执行有没有问题
集成的教程估计有点过时了,我愣是没找着这个东西 @elrrrrrrr
import { cnpmcoreConfig } from 'cnpmcore/common/config';
@Beace #476 #468 我是翻PR找的,目的是为了更新配置项和默认值的时候有类型提示+缺省值。
@baxtergu 我加了下 auth 配置好像也可以跑
集成的教程估计有点过时了,我愣是没找着这个东西
@baxtergu @Beace 有兴趣更新一下文档吗 🤩
插件代码在这里 https://github.com/Beace/eggjs-elasticsearch/blob/main/impl/elasticsearch.ts#L11,跟 ES8 官方姿势一致的 https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/client-connecting.html
@elrrrrrrr 等搜索能力调通以后可以来贡献一下踩坑经验 ,哈哈
@Beace 我的这个有问题的集成的场景感觉就是这个 ESClient 没能通过 cnpmcore infra 里 SearchAdapter 默认实现的注入方式获取,我对比了下 s3-cnpmcore 的实现,它是直接用户在 config 中初始化以后通过 config 对象上的属性传进去的,在我的项目里通过 infra 层来覆盖 NFSClient 实现 S3Like 对象存储服务的接入是 OK 的,也跑了比较长一段时间了。
我明天试试指定 app.config.elasticsearch.ElasticSearch 来用这个插件,当前出错情况下我没用指定传入 Client Class 方式,而是采用 infra 里默认的那个 @Inject 方式的,但是失效了。
为啥 @Inject 方式没生效我也搞不清楚,求 tegg 大佬解惑
@baxtergu 那看看 https://github.com/elrrrrrrr/examples/blob/with-cnpmcore/hello-tegg 再试试,这个也是集成模式。
@baxtergu 那看看 https://github.com/elrrrrrrr/examples/blob/with-cnpmcore/hello-tegg 再试试,这个也是集成模式。
用排除法试了下,应该是 config/plugin.d.ts 没重新生成导致注入没找到,重新生成以后 OK 了。
这会在解决 es 7.x 服务更换 7.x Client 问题...
因为我们内部最高只有 7.x 的 ES,我换了 7 的 Client 包发现 SDK 返回比 8 的多包了一层 body,这个方便兼容下么?我重写插件发现有很多类型 es7 的 sdk 里没有。
@Beace
es7 的话在插件侧做兼容就可以了,晚些我改下插件,内置多个版本的 es sdk 就好了
es7 的话在插件侧做兼容就可以了,晚些我改下插件,内置多个版本的 es sdk 就好了
@Beace 我用重载能力临时解决了下 es7 的 client 问题,现在在导入索引的时候发现有极少数的写入接口会报 "error": "mapper_parsing_exception" 的返回,导入量大概是 1.5w 的包索引,有错误响应的包大概占比低于 1%。
抓到的其中一个日志
涉及索引写入有问题的包名清单:
alphabet
ansi-wrap
any
arr-pluck
arr-reduce
array-every
array-intersection
array-reduce-right
array-rest
array-some
async-helper-base
asyncreduce
base-loader
bufferput
cbor-sync
chainy-plugin-feed
chainy-plugin-set
colorbrewer
config-chain
deep-filter-object
delims
dev-null
dirs
export-dirs
exposify
ext-map
extendonclass
fill-array
filter-array
filter-type
gl-mat2
gl-mat3
gl-quat
gl-vec2
gl-vec3
gl-vec4
glob-base
glob-path-regex
gulp-drafts
has-any-deep
helper-codelinks
helper-concat
helper-read
helper-toc
helper-yaml
init-file-loader
is-class
is-valid-domain
is-valid-path
is-whitespace
jsdom-jscore
lazy
lint-templates
lookup-deps
markdown-link
markdown-reference
mothership
net
noncharacters
preserve
prompt-promise
put
readme-includes
relative-dest
rename-function-calls
resolve-bin
runnel
set
set-object
stack-mapper
stringify-github-url
stringify-travis-url
template-utils
to-arg
to-gfm-code-block
to-key
to-template
transformify
tv4
unix-dgram
update-section
在这里修复了 https://github.com/cnpm/cnpmcore/pull/587
在这里修复了 #587
@Beace 这个提交的版本验证写入索引OK了。我们在使用的过程中发现只用用户名进行检索的时候几乎很难命中,是权重的问题吗?
multi match 那块没写 author 的查询的,你可以加一下
multi match 那块没写 author 的查询的,你可以加一下
我看了下 https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#get-v1search 这个下面的 special search qualifiers 没有实现。
npmio search api 好像实现了,我空了尝试看看能不能搬过来。
PACKAGE_VERSION_ADDED 事件触发搜索写入和 manifest 文件写入可能会有时序问题(搜索先、文件后就会导致索引写入失败), 可以通过 es 重刷接口来补。