从0.10.40升级后,节点HTTP删除请求不再有效

时间:2016-02-23 22:00:43

标签: node.js http elasticsearch

我一直在尝试将我的大多数节点内容升级到4.x但是在执行对Elasticsearch的删除查询时遇到了一些问题。以下工作在0.10.40和之前,但不适用于4.x.x或5.7.0。我没有想法,似乎节点没有发送我的请求正文,因为我从Elasticsearch返回的错误是{"error":"ActionRequestValidationException[Validation Failed: 1: source is missing;]","status":400}

var http = require('http');
var request = http.request({
    host: 'localhost',
    port: 9200,
    path: 'test/col/_query',
    method: 'DELETE'
});

request.on('response', function(res) {
    res.setEncoding('utf8');
    res.on('data', function(response) {
        if(response.indexOf('"failed":0') === -1) {
            console.log('Failed. Response: ', response);
            process.exit(1);
        }
    });
    res.on('end',  function() {
        console.log('completed successfully');
        process.exit(0);
    });
});
request.on('error', function(err) { cb(err); });

var q = {
    query: {
        "bool": {
            "must_not": [
                {"ids": {"values": ['1','2','3'] } }
            ]
        }
    }
};

request.write(JSON.stringify(q));
request.end();

1 个答案:

答案 0 :(得分:10)

HTTP DELETE请求不应包含有效负载。但是,在0.10中,它得到了支持,因为即使没有向服务器发送有效负载,也会沿请求发送Transfer-Encoding: Chunked HTTP标头。这已通过0.11.14 issue 6164修复了@Log4j

从现在开始,如果您确实需要发送带有DELETE请求的正文,您还需要添加一个Content-Length标题,指定您发送的内容的长度,否则服务器将忽略任何有效载荷。

因此,如果您构建这样的请求,它将起作用:

var q = {
    query: {
        "bool": {
            "must_not": [
                {"ids": {"values": ['1','2','3'] } }
            ]
        }
    }
};
var payload = JSON.stringify(q);

var request = http.request({
    host: 'localhost',
    port: 9200,
    path: 'test/col/_query',
    method: 'DELETE',
    headers: {                                    <--- add this
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(payload)
    }
});

...

request.write(payload);
request.end();