Фон
Недавно я работал с Elasticsearch Node.js API для массового индексирования большого файла JSON. Я успешно проанализировал файл JSON. Теперь я должен быть в состоянии передать массив, готовый к индексу, в массовую команду Elasticsearch. Однако при использовании журнала консоли создается впечатление, что массив не должен вызывать каких-либо проблем.
Код ошибки
Следующий код должен взять URL-адрес API (с ответом JSON) и проанализировать его с помощью HTTP-библиотеки Node.js. Затем с помощью API Elasticsearch Node.js он должен массово индексировать каждую запись в массиве JSON в моем индексе Elasticsearch.
var APIUrl = /* The url to the JSON file on the API providers server. */
var bulk = [];
/*
Used to ready JSON file for indexing
*/
var makebulk = function(ParsedJSONFile, callback) {
var JSONArray = path.to.array; /* The array was nested... */
var action = { index: { _index: 'my_index', _type: 'my_type' } };
for(const item of items) {
var doc = { "id": `${item.id}`, "name": `${item.name}` };
bulk.push(action, doc);
}
callback(bulk);
}
/*
Used to index the output of the makebulk function
*/
var indexall = function(madebulk, callback) {
client.bulk({
maxRetries: 5,
index: "my_index",
type: "my_type",
body: makebulk
}, function(err, resp) {
if (err) {
console.log(err);
} else {
callback(resp.items);
}
});
}
/*
Gets the specified URL, parses the JSON object,
extracts the needed data and indexes into the
specified Elasticsearch index
*/
http.get(APIUrl, function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
var APIURLResponse = JSON.parse(body);
makebulk(APIURLResponse, function(resp) {
console.log("Bulk content prepared");
indexall(resp, function(res) {
console.log(res);
});
console.log("Response: ", resp);
});
});
}).on('error', function(err) {
console.log("Got an error: ", err);
});
Когда я запускаю node bulk_index.js
на своем веб-сервере, я получаю следующую ошибку: TypeError: Bulk body should either be an Array of commands/string, or a String
. Однако это не имеет никакого смысла, потому что команда console.log(res)
(из функции indexall
в http.get
запросе клиента) выдает следующее:
Bulk content prepared
Response: [ { index: { _index: 'my_index', _type: 'my_type', _id: '1' } },
{ id: '5', name: 'The Name' }, ... },
... 120690 more items ]
Приведенный выше вывод консоли показывает массив в правильном формате.
Вопрос
Что означает TypeError: Bulk body should either be an Array of commands/string, or a String
, что неправильно в массиве, который я передаю в функцию client.bulk
?
Примечания
Мой сервер в настоящее время работает под управлением Elasticsearch 6.2.4
и Java Development Kit версии 10.0.1
. Все работает, вплоть до сервера Elaticsearch и даже моих сопоставлений Elaticsearch (я не предоставлял код client.indices.putMapping
, однако могу, если это необходимо). Я потратил несколько часов на чтение каждого куска документации, которую я мог найти относительно этой ошибки TypeError. Я не смог найти много информации об этой ошибке, поэтому я не уверен, где еще искать информацию об этой ошибке.