Правильный способ предоставить параметр «запрос» для Neo4j в Cypher REST API в node.js

Как составить правильный запрос Cypher через POST-запрос к Neo4j в node.js?

Код:

var http = require('http');

var options = {
  host: 'a90cfa68c.hosted.neo4j.org',
  port: 7357,
  path: '/db/data/cypher',
  method: 'POST',
  headers: {               
    'Authorization': 'Basic ' + new Buffer("<login>:<password>").toString('base64')                  
  },
  "Content-Type" : "application/json",
  "query" : "START root=node(*) RETURN root" // <--- Doesn't work :(
};

http.request(options, function(res) {
      console.log('STATUS: ' + res.statusCode);
      console.log('HEADERS: ' + JSON.stringify(res.headers));
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
      console.log('BODY: ' + chunk);
      });
}).end();

Результат:

STATUS: 400
HEADERS: {"content-length":"340","content-encoding":"UTF-8","content-type":"application/json","access-control-allow-origin":"*","server":"Jetty(6.1.25)"}
BODY: {
  "message" : "You have to provide the 'query' parameter.",
  "exception" : "BadInputException",
  "stacktrace" : [ "org.neo4j.server.rest.web.CypherService.cypher(CypherService.java:63)", "java.lang.reflect.Method.invoke(Method.java:597)", "org.neo4j.server.extension.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:57)" ]
}

Ожидаемый результат:
Список всех узлов (аналогично POST /db/data/cypher {"query":"START root=node(*) RETURN root"} в консоли Neo4j)


Решение (спасибо Эндрю Палумбо):

// Changes goes here:
var req = http.request(options, function(res) {
      console.log('STATUS: ' + res.statusCode);
      console.log('HEADERS: ' + JSON.stringify(res.headers));
      res.setEncoding('utf8');
      res.on('data', function (chunk) {   
      console.log('BODY: ' + chunk);
      });
});
// Writing into body:
req.write('{"query":"START root=node(*) RETURN root"}');
req.end();

person Dmitriy F.    schedule 25.07.2013    source источник


Ответы (2)


Вы указали 'запрос' как нераспознанный параметр для http.request, но вам нужно write сделать его телом запроса. Вы также, вероятно, захотите переместить строку «Content-Type» внутри объекта option headers.

Взгляните на пример из документации узла:

http://nodejs.org/api/http.html#http_http_request_options_callback

person adpalumbo    schedule 25.07.2013
comment
Я пытался включить {"query":"START root=node(*) RETURN root"} в путь, но это не сработало. STATUS: 400 HEADERS: {"connection":"close","server":"Jetty(6.1.25)"} - person Dmitriy F.; 26.07.2013
comment
Это не принадлежит пути. Это должно быть тело запроса POST. Вы пишете тело, используя функцию-член write http.request, и вы бы вызвали ее перед вызовом end(). - person adpalumbo; 26.07.2013

Вы также можете рассмотреть возможность использования такой платформы, как Express.

person Eddie Dickey    schedule 25.07.2013