无法使用 node.js http.request - MapperParsingException[未能解析]将记录插



尝试使用 node.js 的 http 模块将记录插入 ElasticSearch 中(不使用第三方模块(

设置:在端口 9200 上本地运行 ElasticSearch 实例(默认(

节点.js代码:

var querystring = require('querystring'); // to build our post string
var http = require('http');
// Build the post string from an object
var data = querystring.stringify({
  "text" :"hello world"
});
// An object of options to indicate where to post to
var post_options = {
    host: 'localhost',
    port: '9200',
    path: '/twitter/tweets/1',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(data)
    }
};
// Set up the request
var post_req = http.request(post_options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('Response: ' + chunk);
    });
});
// post the data
post_req.write(data);
post_req.end();

我收到以下错误

{"error":"MapperParsingException[failed to parse]; nested: 
ElasticsearchParseException[Failed to derive xcontent 
from (offset=0, length=18): [116, 101, 120, 116, 61, 104, 
101, 108, 108, 111, 37, 50, 48, 119, 111, 114, 108, 100]]; ",
"status":400}

但是执行以下 CURLs 按预期工作:

curl -XPOST 'http://localhost:9200/twitter/tweet/1' -d '{"message" : "hello world"}'

我查看了以下具有类似错误消息的StackOverflow问题:

  • 索引时获取错误映射器解析异常
  • 尝试索引 PDF 时出现 Elasticsearch 解析异常错误
  • ElasticSearch 错误:MapperParsingException 解析失败

这些都没有回答我的问题。

任何帮助非常感谢。谢谢

注意:我故意尝试仅使用Node.js Core(非第三方(模块来使用ElasticSearch REST API(请不要建议使用elasticsearch-jsesrequest等(

回想起来很明显。
使用查询字符串模块是错误的。
ElasticSearch 希望数据以 JSON("字符串化"(的形式发送。

所以代码需要:

var http = require('http');
// ElasticSearch Expects JSON not Querystring!
var data = JSON.stringify({
  "text" :"everything is awesome"
});
// An object of options to indicate where to post to
var post_options = {
    host: 'localhost',
    port: '9200',
    path: '/twitter/tweets/1234',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(data)
    }
};
// Set up the request
var post_req = http.request(post_options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('Response: ' + chunk);
    });
});
// post the data
post_req.write(data);
post_req.end();

按预期工作。确认使用:

curl -GET http://localhost:9200/twitter/tweets/1234?pretty

(感谢@FelipeAlmeida帮助我意识到这一点(

虽然可以使用

formencode在Elasticsearch上索引数据(我不确定,我必须研究一下(,但99%与Elasticsearch的通信方式是通过纯JSON请求。

因此,请尝试将'Content-Type': 'application/x-www-form-urlencoded'更改为'Content-type': 'application/json'并告诉我它是否有效。

最新更新