Импорт Arangodb через http API с использованием node.js

Я пытаюсь импортировать массив json в arangodb, используя http api из различных узловых модулей, таких как игла, http, запрос. Каждый раз, когда я получаю следующую ошибку или аналогичную:

{ error: true,
  errorMessage: 'expecting a JSON array in the request',
  code: 400,
  errorNum: 400 }

Код приведен ниже (аналогичен для большинства перечисленных выше модулей с небольшими вариациями). Различные сценарии (импорт одного документа и т. д.), по-видимому, указывают на то, что тело сообщения по какой-то причине не распознается правильно.

var needle = require('needle');

var data = [{
    "lastname": "ln",
    "firstname": "fn",
},
{
    "lastname": "ln2",
    "firstname": "fn2"
}];

var options = {  'Content-Type': 'application/json; charset=utf-8'  };


needle.request('POST', 'http://ip:8529/_db/mydb/_api/import?type=array&collection=accounts&createCollection=false', data, options,     function(err, resp) {
    console.log(resp.body);
});

Хотя я могу загружать документы с помощью инструментов разработки curl и браузера, мне не удалось заставить его работать в node.js. Что я делаю не так? Это сводит меня с ума. Любая помощь будет оценена по достоинству. Большое тебе спасибо.


person Anjan Rao    schedule 22.06.2015    source источник


Ответы (1)


Вы можете использовать ngrep (или wireshark), чтобы быстро выяснить, что не так:

ngrep -Wbyline port 8529 -d lo
T 127.0.0.1:53440 -> 127.0.0.1:8529 [AP]
POST /_db/mydb/_api/import?type=array&collection=accounts& createCollection=true HTTP/1.1.
Accept: */*.
Connection: close.
User-Agent: Needle/0.9.2 (Node.js v1.8.1; linux x64).
Content-Type: application/x-www-form-urlencoded.
Content-Length: 51.
Host: 127.0.0.1:8529.
.
##
T 127.0.0.1:53440 -> 127.0.0.1:8529 [AP]
lastname=ln&firstname=fn&lastname=ln2&firstname=fn2

Тело, которое будет отправлено в ArangoDB, должно быть json (как вы пытаетесь достичь, устанавливая тип контента). Создание иглы для фактической публикации json работает следующим образом: (см. https://github.com/tomas/needle#request-options )

var options = {
    Content-Type: 'application/json; charset=utf-8',
    json: true
};

который дает правильный ответ:

{ error: false,
  created: 2,
  errors: 0,
  empty: 0,
  updated: 0,
  ignored: 0 }
person dothebart    schedule 23.06.2015