通过ajax将嵌套对象发布到nodejs服务器返回undefined

时间:2015-08-01 18:43:48

标签: ajax node.js body-parser

我一直试图解决这个问题几个小时但我似乎无法找到问题的原因。

在客户端Javascript我通过ajax将嵌套对象发布到我的后端nodejs服务器。 ajax看起来像这样:

$.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){

  }
});

然后我在我的routes / 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.accountpost_data.stripe都是未定义的。 post_data本身确实返回了数据。

我也尝试使用JSON.stringify从ajax发送数据但是效果不佳。

我还需要在app.js下使用正文解析器

我看不出我的问题在哪里。为什么我的数据未定义?

2 个答案:

答案 0 :(得分:2)

contentType: 'application/json; charset=UTF-8'设置中设置ajax(),否则使用application/x-www-form-urlencoded,这就是您按照自己的方式查看数据格式的原因。

另一种可能的解决方法,因为请求是发送urlencoded数据而不是json(尽管dataType: "json"),是在服务器端的bodyParser.urlencoded()中间件选项中设置extended: true。这将使解析器转换urlencoded请求数据,以便按照您的预期创建对象和数组。

答案 1 :(得分:0)

对我有用的是在客户端将数组转换为字符串,然后将其转换为JSON对象服务器端。