cnpm / cnpmcore

Private NPM Registry for Enterprise
https://npmmirror.com
MIT License
619 stars 84 forks source link

【求助】接入支持 search 接口能力的 cnpmcore 版本遇到了问题 #585

Open baxtergu opened 1 year ago

baxtergu commented 1 year ago

screen_shot_1693823731421

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
  ```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 的实现代码搬到集成的应用中来,遇到的报错是一样的,也就是下面截图中的,有大佬能帮忙看一下造成原因可能是什么吗?

screen_shot_1693823019613

baxtergu commented 1 year ago

尝试了直接在cnpmcore项目里同样的配置是可以正常正常启动的。但是到了应用集成 cnpmcore 包的时候就不行了,像是 cnpmcore 里 app/infra/SearchAdapter.ts 里的 ESClient 注入没生效

fengmk2 commented 1 year ago

你将 elasticsearch 插件关闭

elrrrrrrr commented 1 year ago
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 试试这个?

baxtergu commented 1 year ago

我想要在应用集成cnpmcore包的基础上启用 elasticsearch 的搜索能力现在有法子吗?

baxtergu commented 1 year ago

你将 elasticsearch 插件关闭

我试了应用集成方式,开关项关掉还是抛错。

baxtergu commented 1 year ago

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 试试这个?

其实我还是想要在应用集成的场景下启用这个能力,这个解决方案类似禁用该能力...😮‍💨

elrrrrrrr commented 1 year ago

其实我还是想要在应用集成的场景下启用这个能力,这个解决方案类似禁用该能力...😮‍💨

我在本地没能重现出报错 看贴的示例代码,还要配置一下 node 节点,在应用的 config.default.ts 中添加

  config.elasticsearch = {
    client: {
      node: "http://localhost:9200"
    }
  };
elrrrrrrr commented 1 year ago

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,但是应用启动应该都是正常的

baxtergu commented 1 year ago

其实我还是想要在应用集成的场景下启用这个能力,这个解决方案类似禁用该能力...😮‍💨

我在本地没能重现出报错 看贴的示例代码,还要配置一下 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 的实现方式

baxtergu commented 1 year ago

我用的包管理器是 yarn 1.x 的 latest,我明天试试直接用 npm 排除一下

baxtergu commented 1 year ago

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,但是应用启动应该都是正常的

感谢,我明天也试试这个 demo 在我的环境中执行有没有问题

Beace commented 1 year ago

集成的教程估计有点过时了,我愣是没找着这个东西 @elrrrrrrr

import { cnpmcoreConfig } from 'cnpmcore/common/config';
baxtergu commented 1 year ago

@Beace #476 #468 我是翻PR找的,目的是为了更新配置项和默认值的时候有类型提示+缺省值。

elrrrrrrr commented 1 year ago

image

@baxtergu 我加了下 auth 配置好像也可以跑

集成的教程估计有点过时了,我愣是没找着这个东西

@baxtergu @Beace 有兴趣更新一下文档吗 🤩

Beace commented 1 year ago

插件代码在这里 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

baxtergu commented 1 year ago

@elrrrrrrr 等搜索能力调通以后可以来贡献一下踩坑经验 ,哈哈

@Beace 我的这个有问题的集成的场景感觉就是这个 ESClient 没能通过 cnpmcore infra 里 SearchAdapter 默认实现的注入方式获取,我对比了下 s3-cnpmcore 的实现,它是直接用户在 config 中初始化以后通过 config 对象上的属性传进去的,在我的项目里通过 infra 层来覆盖 NFSClient 实现 S3Like 对象存储服务的接入是 OK 的,也跑了比较长一段时间了。

我明天试试指定 app.config.elasticsearch.ElasticSearch 来用这个插件,当前出错情况下我没用指定传入 Client Class 方式,而是采用 infra 里默认的那个 @Inject 方式的,但是失效了。

为啥 @Inject 方式没生效我也搞不清楚,求 tegg 大佬解惑

elrrrrrrr commented 1 year ago

@baxtergu 那看看 https://github.com/elrrrrrrr/examples/blob/with-cnpmcore/hello-tegg 再试试,这个也是集成模式。

baxtergu commented 1 year ago

@baxtergu 那看看 https://github.com/elrrrrrrr/examples/blob/with-cnpmcore/hello-tegg 再试试,这个也是集成模式。

用排除法试了下,应该是 config/plugin.d.ts 没重新生成导致注入没找到,重新生成以后 OK 了。

这会在解决 es 7.x 服务更换 7.x Client 问题...

baxtergu commented 1 year ago

screen_shot_1693882804616

因为我们内部最高只有 7.x 的 ES,我换了 7 的 Client 包发现 SDK 返回比 8 的多包了一层 body,这个方便兼容下么?我重写插件发现有很多类型 es7 的 sdk 里没有。

@Beace

Beace commented 1 year ago

es7 的话在插件侧做兼容就可以了,晚些我改下插件,内置多个版本的 es sdk 就好了

baxtergu commented 1 year ago

es7 的话在插件侧做兼容就可以了,晚些我改下插件,内置多个版本的 es sdk 就好了

@Beace 我用重载能力临时解决了下 es7 的 client 问题,现在在导入索引的时候发现有极少数的写入接口会报 "error": "mapper_parsing_exception" 的返回,导入量大概是 1.5w 的包索引,有错误响应的包大概占比低于 1%。

抓到的其中一个日志 screen_shot_1693895321013

涉及索引写入有问题的包名清单:

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
Beace commented 1 year ago

在这里修复了 https://github.com/cnpm/cnpmcore/pull/587

baxtergu commented 1 year ago

在这里修复了 #587

@Beace 这个提交的版本验证写入索引OK了。我们在使用的过程中发现只用用户名进行检索的时候几乎很难命中,是权重的问题吗?

Beace commented 1 year ago

multi match 那块没写 author 的查询的,你可以加一下

baxtergu commented 1 year ago

multi match 那块没写 author 的查询的,你可以加一下

我看了下 https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#get-v1search 这个下面的 special search qualifiers 没有实现。

npmio search api 好像实现了,我空了尝试看看能不能搬过来。

baxtergu commented 1 year ago

PACKAGE_VERSION_ADDED 事件触发搜索写入和 manifest 文件写入可能会有时序问题(搜索先、文件后就会导致索引写入失败), 可以通过 es 重刷接口来补。