Nodejs express bodyParser отбрасывает ключи объекта - PullRequest
0 голосов
/ 14 декабря 2018

Я использую nodejs express 4.16.3 с body-parser 1.18.3

Я отправляю объект JSON через ajax спереди на мой сервер, чтобы сохранить его как файл .json.

Вот мой передний код:

function sendobj (datapack) {
  console.log(JSON.stringify(datapack))
  $.ajax({
    url: '/save',
    method: "POST",
    data: datapack,
    success: function(results) {
      alert(results.status)
    }
  });
}

и вывод на консоль после запуска этой функции и вызов ajax

{"nametest":{
"lov":{"2":{"val":"15"}},
"gte":{"2":{"val":"9"}},
}}

На данный момент все в порядке - "lov" и "gte""являются объектами, оба с ключом" 2 ", как мне нужно.

Но на стороне сервера есть код моего приложения:

 var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');

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

    app.post('/save', async (req, res) => {
      try {
      console.log(req.body)

      await fs.writeFile('output.json', JSON.stringify(req.body), function(err) {
    if (err) {
      res.send({
        status: 'Error!'
      })
      return
    }

    res.send({
      status: 'Saved!'
    })

  });

} catch (e) {
  console.log(e)
}
});

Вывод консоли сервера:

{ nametest:
{ gte: [ { val: '9' } ],
  lov: [ { val: '15' } ]
   } }

output.json

{"nametest":{"gte":[{"val":"9"}],"lov":[{"val":"15"}]}}

Похоже, мои первичные объекты 'gte' и 'lov' преобразуются в массивы, и они теряют их ключи ..

Я что-то упустил внастройки моего приложения / ajax?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

В вашем AJAX-запросе необходимо указать полезную нагрузку.

function sendobj (datapack) {
  console.log(JSON.stringify(datapack))
  $.ajax({
  url: '/save',
  method: "POST",
  data: JSON.stringify(datapack),
  success: function(results) {
    alert(results.status)
  }
  });
}

В экспрессе обязательно добавьте тип application/json.Как в

app.use(bodyParser.json({ type: 'application/json' }))

Затем выйдите из имени.req.body.nametest Это вывод, который я получил

{ lov: { '2': { val: '15' } }, gte: { '2': { val: '9' } } }

Надеюсь, это поможет

0 голосов
/ 14 декабря 2018

Может быть, вы не отправляете через действительный JSON?

Попробуйте это.У вас есть лишняя запятая.

{"nametest":{
"lov":{"2":{"val":"15"}},
"gte":{"2":{"val":"9"}}
}}
...