Mongodb, вставляющий json из http.post в коллекцию, изменяет json

Я создаю страницу администратора для своего мобильного приложения, используя mongodb, nodejs и т. д. Я пытаюсь вставить существующий файл json в коллекцию mongodb. Я попробовал mongoimport, но это просто не сработало (я прочитал и попробовал несколько обсуждений по этому поводу). Итак, я понял, что могу отправить его через http POST и использовать insert().

У меня работают три сервера localhost: mongodb, сервер приложений и страница администрирования веб-сайта.

json-файл выглядит так:

{"data_version":1,"drivers_teams":{"drivers":{"4":{"name":"Hofer","firstname": ... }}}

клиент POST

    $.getJSON("initialData.json", function(json) {
            $.ajax({
              url: 'localhost:3080/client_data',
              type: 'POST',
              data: json,
              success: function(res) {
                console.log(res);
              }.bind(this),
              error: function(xhr, status, err) {
                console.error(url, status, err.toString());
              }.bind(this)
            });
    }.bind(this));

сервер ПОСТ

app.use(bodyParser.json({limit: '1000kb', parameterLimit: 5000}));
app.use(bodyParser.urlencoded({limit: '1000kb', parameterLimit: 5000, extended: false}));

    app.post('/client_data/', (req, res) => {
      const db = req.db;
      const collection = db.get('collection');

      collection.insert(req.body, function (err, doc) { 
            if (err) {
              res.status(500).send('Invalid request');
              return;
            }  
            res.send('ok');
      });
    });

пока все хорошо, но после того, как мне удастся вставить данные и спросить сервер, что у вас есть? Я получил:

{"_id":"57872f9fe51246dc1b3bbc93","data_version":"1","drivers_teams[drivers][4][name]":"Hofer","drivers_teams[drivers][4][firstname] ... }}}

Я больше не могу использовать эти данные. Итак, вопрос: как я могу вставить вложенный json как есть, когда он поступает из тела http-запроса?

ИЗМЕНИТЬ

Хорошо, разобрался, как сделать AS-IS insert(). Вместо http.post я загружаю json прямо в коллекцию;

сервер

import mydata from './initialData.json';

...

collection.insert(mydata, function (err, doc) { ... });

Все еще смущен, что я делаю неправильно с телом запроса. Потому что теперь, если я сделаю collection.update(); от клиента обновленный элемент явно перепутался с обозначением скобок.


person spiritworld    schedule 14.07.2016    source источник
comment
Вы видите ключевые атрибуты с квадратными скобками в mongodb I.e последний json в вашем вопросе?   -  person notionquest    schedule 14.07.2016
comment
Используете ли вы какие-то промежуточные программы в экспрессах, такие как bodyParser?   -  person Amiram Korach    schedule 14.07.2016
comment
да, app.use(bodyParser.json({limit: '1000kb', parameterLimit: 5000}));   -  person spiritworld    schedule 14.07.2016
comment
хорошо, это парсер тела, вот та же проблема: stackoverflow.com/questions/26711666/   -  person spiritworld    schedule 15.07.2016


Ответы (1)


Решение состояло в том, чтобы изменить параметры bodyParser, закодированные в URL-адресе.

app.use(bodyParser.urlencoded({ extended: true }));

это было действительно нелогично, по крайней мере для меня, потому что я искал проблему, связанную с json, а не с формами... Единственная обратная сторона в том, что все является строкой, а не их истинным типом, но мне уже все равно, как только я м так далеко.

ИЗМЕНИТЬ

Чтобы получить типы данных прямо на стороне сервера, мне нужно было JSON.stringify(data) и добавить contentType: 'application/json' в параметрах POST.

    post: function(data) {      
        $.ajax({
            url: url,
            type: 'POST',
            data: JSON.stringify(data),
            contentType: 'application/json',
            success: function(res) {
                console.log(res)
            }.bind(this),
            error: function(xhr, status, err) {
                console.error(url, status, err.toString());
            }.bind(this)
        });
    },
person spiritworld    schedule 15.07.2016