7

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?!

aynber
  • 22,380
  • 8
  • 50
  • 63
JMWhittaker
  • 3,633
  • 3
  • 23
  • 30
  • What code you serializing this information on the post, and what code do you use to deserialize it on the server? Ex: `JSON.stringify` etc – Tejs May 08 '11 at 13:38
  • I'm using Node.js with Express. It parses any sent body requests using Express.bodyParser. That's all I know I'm new to Node.JS – JMWhittaker May 08 '11 at 15:08

4 Answers4

18

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.

Rajat
  • 32,970
  • 17
  • 67
  • 87
  • I had the same issue with Polymer's core-ajax. Setting the contentType to application/json resolved the issue. Thanks. – BKH Apr 04 '15 at 18:47
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.

Community
  • 1
  • 1
Peter Lyons
  • 142,938
  • 30
  • 279
  • 274
0

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.

Josiah
  • 3,232
  • 3
  • 25
  • 25
-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
}
Tejs
  • 40,736
  • 10
  • 68
  • 86
  • I get your theory but notes.length is undefined. – JMWhittaker May 08 '11 at 19:43
  • 4
    Using `eval` against data submitted from the client is a gigantic security hole. `eval` should be avoided as a general rule and is almost never necessary given the other options for introspection and metaprogramming in javascript. – Peter Lyons May 28 '11 at 05:55