cnpmcore icon indicating copy to clipboard operation
cnpmcore copied to clipboard

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

Open baxtergu opened this issue 2 years ago • 26 comments

  • 背景:通过 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 avatar Sep 04 '23 10:09 baxtergu

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

baxtergu avatar Sep 04 '23 12:09 baxtergu

你将 elasticsearch 插件关闭

fengmk2 avatar Sep 04 '23 12:09 fengmk2

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 avatar Sep 04 '23 12:09 elrrrrrrr

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

baxtergu avatar Sep 04 '23 12:09 baxtergu

你将 elasticsearch 插件关闭

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

baxtergu avatar Sep 04 '23 13:09 baxtergu


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 avatar Sep 04 '23 13:09 baxtergu

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

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

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

elrrrrrrr avatar Sep 04 '23 14:09 elrrrrrrr

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

elrrrrrrr avatar Sep 04 '23 14:09 elrrrrrrr

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

我在本地没能重现出报错 看贴的示例代码,还要配置一下 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 avatar Sep 04 '23 14:09 baxtergu

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

baxtergu avatar Sep 04 '23 14:09 baxtergu

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 在我的环境中执行有没有问题

baxtergu avatar Sep 04 '23 14:09 baxtergu

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

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

Beace avatar Sep 04 '23 14:09 Beace

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

baxtergu avatar Sep 04 '23 15:09 baxtergu

image

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

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

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

elrrrrrrr avatar Sep 04 '23 15:09 elrrrrrrr

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

Beace avatar Sep 04 '23 15:09 Beace

@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 avatar Sep 04 '23 15:09 baxtergu

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

elrrrrrrr avatar Sep 05 '23 02:09 elrrrrrrr

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

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

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

baxtergu avatar Sep 05 '23 02:09 baxtergu

screen_shot_1693882804616

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

@Beace

baxtergu avatar Sep 05 '23 03:09 baxtergu

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

Beace avatar Sep 05 '23 04:09 Beace

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

baxtergu avatar Sep 05 '23 06:09 baxtergu

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

Beace avatar Sep 05 '23 10:09 Beace

在这里修复了 #587

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

baxtergu avatar Sep 07 '23 07:09 baxtergu

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

Beace avatar Sep 07 '23 13:09 Beace

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

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

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

baxtergu avatar Sep 08 '23 00:09 baxtergu

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

baxtergu avatar Sep 24 '23 08:09 baxtergu