Elasticsearch js 批量索引类型错误

Elasticsearch js Bulk Index TypeError

背景

最近,我一直在使用 Elasticsearch Node.js API 对大型 JSON 文件进行批量索引。我已经成功解析了 JSON 文件。现在,我应该能够将索引就绪数组传递到 Elasticsearch 批量命令中。但是,使用控制台日志,似乎数组应该不会引起任何问题。

错误代码

以下代码应该采用 API URL(带有 JSON 响应)并使用 Node.js HTTP 库对其进行解析。然后使用 Elasticsearch Node.js API,它 应该 将 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) 命令(来自 http.get 客户端请求下的 indexall 函数)输出以下内容:

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 函数的数组有什么问题?

备注

我的服务器当前是 运行ing Elasticsearch 6.2.4 和 Java 开发工具包版本 10.0.1。就 Elaticsearch 服务器而言,一切正常,甚至我的 Elaticsearch 映射(我没有提供 client.indices.putMapping 代码,但如果需要,我可以提供)。我花了多个小时阅读我能找到的关于此 TypeError 的所有文档。关于抛出的错误,我找不到太多信息,所以我不确定还能在哪里查找有关此错误的信息。

您的代码中似乎有错字。

var indexall = function(**madebulk**, callback) {
    client.bulk({
        maxRetries: 5,
        index: "my_index",
        type: "my_type",
        body: **makebulk**

检查makebulk和makebulk。