Nodejs @elastic/elasitcsearch库内存泄漏 解决方案

废话不多说直接上代码
注 : 这里使用了axios 作为中间请求。 如使用 axios 请 npm install axios

'use strict';

const config = require('config');
const { Client, Transport} = require('@elastic/elasticsearch');
const debug = require('debug')('elasticsearch')
const once = require('once')
const axios = require('axios');

const requestTimeout = 1000 * 10;
const client = new Client({
      node: ['127.0.0.1:19200],
      Transport: MyTransport,
      requestTimeout: requestTimeout,
      sniffOnStart: false
    });

function call(config) {
  let source = axios.CancelToken.source();
  config.cancelToken = source.token;
  return axios(config)
    .then(res => {
      source = null;
      return res;
    })
    .catch(err => {
      source = null;
      return err.response;
    });
}

function prepareHeaders (headers = {}, auth) {
  if (auth != null && headers.authorization == null) {
    /* istanbul ignore else */
    if (auth.apiKey) {
      if (typeof auth.apiKey === 'object') {
        headers.authorization = 'ApiKey ' + Buffer.from(`${auth.apiKey.id}:${auth.apiKey.api_key}`).toString('base64')
      } else {
        headers.authorization = `ApiKey ${auth.apiKey}`
      }
    } else if (auth.bearer) {
      headers.authorization = `Bearer ${auth.bearer}`
    } else if (auth.username && auth.password) {
      headers.authorization = 'Basic ' + Buffer.from(`${auth.username}:${auth.password}`).toString('base64')
    }
  }
  return headers
}

class MyTransport extends Transport {
  request (params, options, callback) {
    if (callback == null) {
      return new Promise((resolve, reject) => {
        this.request(params, options, (err, result) => {
          err ? reject(err) : resolve(result)
        })
      })
    }

    callback = once(callback);
    const connectionPool = this.connectionPool;
    const opts = connectionPool.connections[connectionPool.connections.length - 1];
    const method = params.method === 'HEAD' ? 'get' : params.method.toLowerCase();
    let url = opts.url.origin + params.path;
    // if ( method !== 'get' && params.querystring ) {
    //  Object.keys(params.querystring).forEach( key => {
    //    const separator = url && url.includes('?') ? '&' : '?';
    //    url += (separator + key + '=' + params.querystring[key]);
    //  })
    // }
    call({
      method: method,
      url: url,
      data: params.body,
      params: params.querystring,
      headers: prepareHeaders({...params.headers, ...this.headers}, connectionPool.auth),
      timeout: config.get('elasticsearch.requestTimeout')
    }).then(function (response) {
      const result = {
        body: response.data,
        statusCode: response.status,
        meta: {
          statusCode: response.status,
        }
      }
      callback(null, result);
    }).catch(function (error) {
      const statusCode = error && error.status;
      if (error != null || (statusCode === 502 || statusCode === 503 || statusCode === 504)) {
        debug(`elasticsearch request [${params.method}]${opts.url.origin + params.path} error: ${error.status} - ${error.statusText}`);
      }
      const result = {
        body: error,
        statusCode: statusCode,
        meta: {
          statusCode: statusCode,
        }
      }
      callback(result, result);
    })
  }
}

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)