POST array data to Express gets parsed out as JSON
Asked Answered
C

4

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

Caylacaylor answered 8/5, 2011 at 13:34 Comment(2)
What code you serializing this information on the post, and what code do you use to deserialize it on the server? Ex: JSON.stringify etcPerception
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.JSCaylacaylor
D
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.

Diazo answered 9/7, 2012 at 15:28 Comment(1)
I had the same issue with Polymer's core-ajax. Setting the contentType to application/json resolved the issue. Thanks.Incubus
O
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.

Oxford answered 28/5, 2011 at 5:53 Comment(0)
L
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.

Lineup answered 16/4, 2012 at 7:14 Comment(0)
P
-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
}
Perception answered 8/5, 2011 at 15:38 Comment(2)
I get your theory but notes.length is undefined.Caylacaylor
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.Oxford

© 2022 - 2024 — McMap. All rights reserved.