zoma.saf
zoma.saf

Reputation: 568

req.body can't be read as an array

I'm using node.js to receive a post request, the request body has this content after printing it using console.log():

{ 
  'object 1': 
   { 
     deviceType: 'iPad Retina',
     guid: 'DF1121F9-FE66-4772-BE74-42936F1357FF',
     is_deleted: '0',
     last_modified: '1970-12-19T06:01:17.171',
     name: 'test1',
     projectDescription: '',
     sync_status: '1',
     userName: 'testUser' 
   },
  'object 0': 
   { 
     deviceType: 'iPad Retina',
     guid: '18460A72-2190-4375-9F4F-5324B2FCCE0F',
     is_deleted: '0',
     last_modified: '1970-12-19T06:01:17.171',
     name: 'test2',
     projectDescription: '',
     sync_status: '1',
     userName: 'testUser' 
   } 
}

I'm getting the request using the below node.js code:

var restify = require('restify'),
    mongoose = require('mongoose');
var connect = require('connect');
var bodyParser = require('body-parser');
/*server declaration
...
...
*/
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: true }));

server.post('/project', function (req, res, next) {
       console.log(req.body);//the output is shown above
       console.log(req.body.length);// --> output is undefined

       //2
       body.req.forEach(function (item) {//got an exception 
       console.log(item);
   });
});

The second part of the code which has forEach function gives this exception "[TypeError: Object #<Object> has no method 'forEach']"

Do you know what am I missing?

Upvotes: 7

Views: 30000

Answers (3)

Mr. Simplicity
Mr. Simplicity

Reputation: 19

I use JS object, it works fast and for sure. Also I re-use Object.keys for email/DB row/column names. This is working website (professorMiriam.com/donate) code:

      app.post('/donate', (req, res) => {  
    let nm1=req.body.name1,nm2=req.body.name2;
    let frm={
    'Name':nm1 +' '+ nm2,
    'Email':req.body.email,
    'Date':req.body.dt,
    'Endorse':req.body.rcmmnd,
    'Note':req.body.note,
    'ip':req.body.ip,
    'Amount':req.body.mnt,
    'Often':req.body.often};
    
     for(const key of Object.keys(frm)) {if(frm[key].length<1){frm[key]='N/A';}}

//simplicity to add email just in 2!! lines:
let strng=JSON.stringify(frm); strng=strng.replace(/","/g,'<br>').replace(/":"/g,': ').replace('{"','').replace('"}','<br>END');    
var mail={from:'[email protected]',to:[USR,USRF],subject:usd,html:strng};  

Upvotes: 1

Anurag Peshne
Anurag Peshne

Reputation: 1547

forEach is defined only for Arrays.

You need to use for...in loop instead:

for (var key in req.body) {
  if (req.body.hasOwnProperty(key)) {
    item = req.body[key];
    console.log(item);
  }
}

Upvotes: 12

Peter Herdenborg
Peter Herdenborg

Reputation: 5962

req.body isn't an array, but an object with two properties. This is evident from the console.log output you've provided. Therefore, it has no length property and no forEach method.

If it had been an array, it would have looked like this:

[ 
   { 
     deviceType: 'iPad Retina',
     guid: 'DF1121F9-FE66-4772-BE74-42936F1357FF',
     is_deleted: '0',
     last_modified: '1970-12-19T06:01:17.171',
     name: 'test1',
     projectDescription: '',
     sync_status: '1',
     userName: 'testUser' 
   },
   { 
     deviceType: 'iPad Retina',
     guid: '18460A72-2190-4375-9F4F-5324B2FCCE0F',
     is_deleted: '0',
     last_modified: '1970-12-19T06:01:17.171',
     name: 'test2',
     projectDescription: '',
     sync_status: '1',
     userName: 'testUser' 
   } 
]

To iterate over the keys of the object you have, you can use the construct

for(var key in req.body) {
  if(req.body.hasOwnProperty(key)){
    //do something with e.g. req.body[key]
  }
}

Upvotes: 16

Related Questions