Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Receiving Jquery POST data in Express

Edit See the accepted answer below for the fix. I also had to remove the line contentType: 'appliction/json', from my POST request.

I'm trying to send a string to Node.js / Express, but req.body is undefined server-side.

Client jQuery:

$.post({
        traditional: true,
        url: '/matches',
        contentType: 'appliction/json',
        data: viewedProfiles,
        dataType: 'json',
        success: function(response){

Express:

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.post('/matches', isLoggedIn, function(req, res){
  console.log(req.body) // this is undefined
  var loadedProfiles = []
  loadedProfiles.push(req.body.viewedProfiles)
  console.log('loadedProfiles')
  console.log(loadedProfiles)

I've tried:

  • not specifying 'dataType'
  • setting data: JSON.stringify(viewProfiles)
  • splitting the string into an array on the client, and then having jQuery stringify it
  • looking for req.params instead of req.body (clutching at straws)

I can see the XHR request in dev tools, and it contains the string I'm expecting.

What super obvious thing am I missing to send the data to Express?

Thanks.

like image 800
Runny Yolk Avatar asked Dec 18 '22 12:12

Runny Yolk


2 Answers

Your server side code looks fine but you need to use $.ajax() rather than $.post() function because $.post() function send data into url (with url encoded). So your JQuery code would be

$.ajax({
        url: '/matches',
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({"viewedProfiles": viewedProfiles}),
        success: function(response){

I hope this will help you

like image 162
Arif Khan Avatar answered Jan 04 '23 09:01

Arif Khan


I've configured an exact same setup. And code below works:

var profiles = { 'data' : 'hello' };

$.post({
        traditional: true,
        url: '/matches',
        contentType: 'application/json',
        data: JSON.stringify( profiles ),
        dataType: 'json',
        success: function(response){ console.log( response ); }
} );

My nodejs engine:

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.post( '/matches' , function(req, res){
  console.log(req.body) // this outputs: { data: 'hello' }
} );

Btw, There is a typo where your contentType is, 'applicAtion/json'

like image 42
Kartal Avatar answered Jan 04 '23 09:01

Kartal