Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
baxtergu opened this issue Sep 4, 2023 · 26 comments

Comments

@baxtergu
Copy link

baxtergu commented Sep 4, 2023

  • 背景:通过 cnpmcore 包集成方式来引入 3.43.4 版本的,先前使用 3.42.x 版本是正常的。
  • 一些可能有关联的信息如下
    • node: 18.17.1
    • typescript:

screen_shot_1693823731421

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

screen_shot_1693823019613

@baxtergu baxtergu changed the title 接入 npm search 能力遇到的问题 【求助】接入 npm search 能力遇到的问题 Sep 4, 2023
@baxtergu baxtergu changed the title 【求助】接入 npm search 能力遇到的问题 【求助】接入支持 search 接口能力的 cnpmcore 版本遇到了问题 Sep 4, 2023
@baxtergu
Copy link
Author

baxtergu commented Sep 4, 2023

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

@fengmk2
Copy link
Member

fengmk2 commented Sep 4, 2023

你将 elasticsearch 插件关闭

@elrrrrrrr
Copy link
Member

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
Copy link
Author

baxtergu commented Sep 4, 2023

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

@baxtergu
Copy link
Author

baxtergu commented Sep 4, 2023

你将 elasticsearch 插件关闭

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

@baxtergu
Copy link
Author

baxtergu commented Sep 4, 2023

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
Copy link
Member

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

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

  config.elasticsearch = {
    client: {
      node: "http://localhost:9200"
    }
  };

@elrrrrrrr
Copy link
Member

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
Copy link
Author

baxtergu commented Sep 4, 2023

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

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

baxtergu commented Sep 4, 2023

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

@baxtergu
Copy link
Author

baxtergu commented Sep 4, 2023

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
Copy link
Contributor

Beace commented Sep 4, 2023

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

import { cnpmcoreConfig } from 'cnpmcore/common/config';

@baxtergu
Copy link
Author

baxtergu commented Sep 4, 2023

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

@elrrrrrrr
Copy link
Member

elrrrrrrr commented Sep 4, 2023

image

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

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

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

@baxtergu
Copy link
Author

baxtergu commented Sep 4, 2023

@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
Copy link
Member

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

@baxtergu
Copy link
Author

baxtergu commented Sep 5, 2023

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

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

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

@baxtergu
Copy link
Author

baxtergu commented Sep 5, 2023

screen_shot_1693882804616

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

@Beace

@Beace
Copy link
Contributor

Beace commented Sep 5, 2023

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

@baxtergu
Copy link
Author

baxtergu commented Sep 5, 2023

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
Copy link
Contributor

Beace commented Sep 5, 2023

在这里修复了 #587

fengmk2 pushed a commit that referenced this issue Sep 5, 2023
fengmk2 pushed a commit that referenced this issue Sep 5, 2023
[skip ci]

## [3.43.5](v3.43.4...v3.43.5) (2023-09-05)

### Bug Fixes

* the license may be an object ([#587](#587)) ([88b6afb](88b6afb)), closes [/github.com//issues/585#issuecomment-1706009496](https://github.com/cnpm//github.com/cnpm/cnpmcore/issues/585/issues/issuecomment-1706009496)
@baxtergu
Copy link
Author

baxtergu commented Sep 7, 2023

在这里修复了 #587

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

@Beace
Copy link
Contributor

Beace commented Sep 7, 2023

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

@baxtergu
Copy link
Author

baxtergu commented Sep 8, 2023

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

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

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

@baxtergu
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants