废话不多说直接上代码
注 : 这里使用了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);
})
}
}