高级配置

编辑

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

  • 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 core),则应重写此类中的 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 版本升级到 8.x 版本的 Elasticsearch,而无需一次性升级所有内容。在配置兼容性标头后,应首先升级 Elasticsearch,然后应升级客户端。要启用此设置,请将环境变量 ELASTIC_CLIENT_APIVERSIONING 配置为 true