POST array data to Express gets parsed out as JSON

人走茶凉 提交于 2019-12-04 20:54:58

问题


My app is Node.js using Express.

Sending this test data from my client using jQuery POST:

{
title: 'hello',
notes: [
{title: 'note 1'},
{title: 'note 2'}
]

}

And this is the result in my server code:

{ title: 'hello', notes: { '0': { title: 'note 1' }, '1': { title: 'note 2' } } }

I want to get the array of notes to insert into my DB as an Array. What am I missing?


As I can't add an answer myself for 8 hours (wtf?) BUT it does not really answer why Express.bodyParser does not parse JSON correctly

Ok I can get it to work by using:

JSON.stringify ( data )

on the client then server side using

JSON.parse( req.rawBody )

This does feel wrong and why does Express.bodyParser not parse JSON correctly?!


回答1:


On your client:

$.ajax({
  type: 'POST',
  data: JSON.stringify(data),
  contentType: 'application/json',
  url: '/endpoint'
});

On your server:

console.log('POST: ',req.body);

The problem is jQuery mucks around with your data before sending it. If you set the right MIME type, than it leaves you free.




回答2:


Can you post your client side jQuery code, please? By default jQuery will send data as urlencoded, not JSON. See this question's answer for the way to ensure jQuery sends real JSON data.

FYI the express/connect bodyParser middleware simply uses JSON.parse to parse JSON (and qs.parse to parse urlencoded data). I don't think there are any glaring bugs in those code. Thus I think you should double-check the data you are sending from the browser.




回答3:


I came across this old question when looking for some other nodejs stuff.

It is a common misconception that jQuery.ajax() functions send data using JSON. Data is sent by jQuery as POST data and not a JSON string. As such all data types (including the numbers in your array) are sent as strings.

This means that express parses the 'array' keys as a string, and since an array can't have a string key in javascript without being an object, it is cast to an object.




回答4:


It all makes sense then; you can use Express.bodyParser to get a result like that, or you can use JSON.parse or even eval('(' + myPostedData + ')') to get a result object without the indexes.

With your current setup, all you need to do is:

for(var j = 0; j < myVariable.notes.length; j++)
{
    var currentNode = myVariable.notes[j];

    //currentode.title should be 'note 1' for j = 0, etc
}


来源:https://stackoverflow.com/questions/5927742/post-array-data-to-express-gets-parsed-out-as-json

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!