首页 > 解决方案 > @types/elasticsearch SearchResponse 类型错误

问题描述

当我使用 @nestjs/elasticsearch 的 ElasticsearchService 时,响应的结果与 @types/elasticsearch 的类型 SearchResponse 不匹配,因为 SearchResponse 是一个对象,但我实际上得到了一个包含 SearchResponse 对象和 Http 状态代码的数组,有人知道如何关闭它?

例子:

[
  {
    ...,
    "aggregations": {
      "backendVersions": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "1.0.0",
            "doc_count": 1
          }
        ]
      }
    }
  },
  200
]

标签: typescriptelasticsearchhttp-status-codesnestjs

解决方案


@nestjs/elasticsearch 的 ElasticsearchService 使用 bindNodeCallback 包装了 es 客户端,文档对此进行了解释。

所以这:

client.search({
  index: 'my-index',
  body: { foo: 'bar' }
}, (err, body, statusCode, headers) => {
  if (err) console.log(err)
})

将被转换为一个 observable,它将发出一个值,其中包含回调中的 args 减去数组中的 err。

service.search({
  index: 'my-index',
  body: { foo: 'bar' }
}).subscribe(value => {
  console.log(value); // [body, statusCode, headers]
});

您无法关闭此功能,但您可以通过以下方式直接使用 elasticsearch 客户端getClient()

const searchResponse = await service.getClient().search({
  index: 'my-index',
  body: { foo: 'bar' }
});

还要记住,@elastic/elasticsearch [7.x] 中会有重大变化

client.search({
  index: 'my-index',
  body: { foo: 'bar' }
}, (err, { body, statusCode, headers, warnings }) => {
  if (err) console.log(err)
});

推荐阅读