高级配置编辑

如果您需要大量自定义客户端行为,您来对地方了!客户端允许您自定义以下内部组件

  • ConnectionPool
  • Connection
  • Serializer

有关 Transport 类的信息,请参阅 传输.

ConnectionPool编辑

此类负责将您正在使用的所有 Elasticsearch 连接保存在内存中。每个节点只有一个连接。连接池处理复活策略和池的更新。

const { Client, ConnectionPool } = require('@elastic/elasticsearch')

class MyConnectionPool extends ConnectionPool {
  markAlive (connection) {
    // your code
    super.markAlive(connection)
  }
}

const client = new Client({
  ConnectionPool: MyConnectionPool,
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' }
})

Connection编辑

此类表示单个节点,它包含我们对节点的所有信息,例如角色、ID、URL、自定义标头等等。实际的 HTTP 请求在此处执行,这意味着如果您想替换默认的 HTTP 客户端(Node.js 核心),您应该覆盖此类的 request 方法。

const { Client, BaseConnection } = require('@elastic/elasticsearch')

class MyConnection extends BaseConnection {
  request (params, callback) {
    // your code
  }
}

const client = new Client({
  Connection: MyConnection,
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' }
})

Serializer编辑

此类负责对每个请求进行序列化,它提供以下方法

  • serialize(object: any): string; 序列化请求对象。
  • deserialize(json: string): any; 反序列化响应字符串。
  • ndserialize(array: any[]): string; 序列化批量请求对象。
  • qserialize(object: any): string; 序列化请求查询参数。
const { Client, Serializer } = require('@elastic/elasticsearch')

class MySerializer extends Serializer {
  serialize (object) {
    // your code
  }
}

const client = new Client({
  Serializer: MySerializer,
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' }
})

潜在敏感数据的脱敏编辑

当客户端引发源自 HTTP 层的 Error(例如 ConnectionErrorTimeoutError)时,通常会将一个 meta 对象附加到错误对象,其中包含用于调试的有用元数据,例如请求和响应信息。由于这可能包含潜在的敏感数据,例如 Authorization 标头中的身份验证密钥,因此客户端采取措施在附加和序列化此元数据时对敏感数据的常见来源进行脱敏。

如果您的配置需要额外的标头或其他可能包含敏感数据的配置,您可能需要调整这些设置以考虑这一点。

默认情况下,redaction 选项设置为 { type: 'replace' },它递归搜索敏感的键名(不区分大小写),并将它们的值替换为字符串 [redacted]

const { Client } = require('@elastic/elasticsearch')

const client = new Client({
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' },
})

try {
  await client.indices.create({ index: 'my_index' })
} catch (err) {
  console.log(err.meta.meta.request.options.headers.authorization) // prints "[redacted]"
}

如果您想对其他属性进行脱敏,您可以包含要搜索和替换的其他键名

const { Client } = require('@elastic/elasticsearch')

const client = new Client({
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' },
  headers: { 'X-My-Secret-Password': 'shhh it's a secret!' },
  redaction: {
    type: "replace",
    additionalKeys: ["x-my-secret-password"]
  }
})

try {
  await client.indices.create({ index: 'my_index' })
} catch (err) {
  console.log(err.meta.meta.request.options.headers['X-My-Secret-Password']) // prints "[redacted]"
}

或者,如果您知道根本不会使用元数据,将脱敏类型设置为 remove 将完全删除所有潜在敏感数据的可选来源,或者将它们替换为 null(对于必需属性)。

const { Client } = require('@elastic/elasticsearch')

const client = new Client({
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' },
  redaction: { type: "remove" }
})

try {
  await client.indices.create({ index: 'my_index' })
} catch (err) {
  console.log(err.meta.meta.request.options.headers) // undefined
}

最后,如果您希望完全关闭脱敏,也许是在本地开发环境中调试时,您可以将脱敏类型设置为 off。这将使客户端恢复到 8.11.0 之前的行为,其中基本脱敏仅在常见的序列化方法(如 console.logJSON.stringify)期间执行。

不建议在生产环境中将 redaction.type 设置为 off

const { Client } = require('@elastic/elasticsearch')

const client = new Client({
  cloud: { id: '<cloud-id>' },
  auth: { apiKey: 'base64EncodedKey' },
  redaction: { type: "off" }
})

try {
  await client.indices.create({ index: 'my_index' })
} catch (err) {
  console.log(err.meta.meta.request.options.headers.authorization) // the actual header value will be logged
}

迁移到 v8编辑

Node.js 客户端可以配置为发出 HTTP 标头 Accept: application/vnd.elasticsearch+json; compatible-with=7,它向 Elasticsearch 发出信号,表明客户端正在请求 7.x 版本的请求和响应主体。这允许在不一次升级所有内容的情况下从 7.x 版本的 Elasticsearch 升级到 8.x 版本。配置兼容性标头后,应首先升级 Elasticsearch,然后升级客户端。要启用此设置,请将环境变量 ELASTIC_CLIENT_APIVERSIONING 配置为 true