Отправка вложенного объекта на сервер nodejs через ajax возвращает значение undefined

Я пытался понять это уже несколько часов, но не могу найти причину проблемы.

На стороне клиента Javascript я отправляю вложенный объект через ajax на свой внутренний сервер nodejs. Аякс выглядит так:

$.ajax({
  type: "POST",
  url: "/user/save",
  data: {
    "account": {
      "username": $signupForm.find("input[name='register_username']").val(),
      "email": $signupForm.find("input[name='register_email']").val(),
      "password": $signupForm.find("input[name='register_password']").val(),
      "plan": subscription
    },
    "stripe": stripeResponse
  },
  dataType: "json",
  beforeSend: function(){
    $.fn.showLoading();
  },
  success: function(data){

  }
});

Затем я ловлю это в своих маршрутах/index.js

router.post('/user/save', function(req, res){
  var post_data = req.body;
  console.info(post_data);

  var account = post_data.account;
  var card = post_data.stripe;

  console.log(account);
  console.log(card);

  // Rest of code...

Проблема здесь в том, что по какой-то причине и post_data.account, и post_data.stripe возвращаются как неопределенные. Сам post_data действительно возвращает данные.

Я также пытался отправить данные из ajax с помощью JSON.stringify, но это тоже не сработало.

У меня также есть body-parser, который используется в app.js.

Я не вижу, где моя проблема. Почему мои данные не определены?


person Karl Viiburg    schedule 01.08.2015    source источник
comment
Что говорит console.info(post_data)?   -  person John Weisz    schedule 01.08.2015
comment
@JohnWhite console.info(post_data) возвращает данные, которые я должен получить: { 'account[username]': "asd", 'account[email]': "asd", ... }   -  person Karl Viiburg    schedule 01.08.2015


Ответы (2)


Установите contentType: 'application/json; charset=UTF-8' в настройках ajax(), иначе будет использоваться application/x-www-form-urlencoded, поэтому вы видите данные в таком формате.

Другое возможное исправление, поскольку запрос отправляет данные в кодировке URL вместо json (несмотря на dataType: "json"), заключается в установке extended: true в параметрах промежуточного ПО bodyParser.urlencoded() на стороне сервера. Это заставит синтаксический анализатор преобразовать закодированные в urlencode данные запроса таким образом, чтобы объекты и массивы создавались так, как вы ожидаете.

person mscdex    schedule 01.08.2015
comment
extended: true сделал свое дело. Большое спасибо за помощь и информацию о том, что делает extend. - person Karl Viiburg; 02.08.2015

Что сработало для меня, так это преобразовать массив в строку на стороне клиента, а затем преобразовать его в серверную часть объекта JSON.

person Wise    schedule 10.04.2020