Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

req.body can't be read as an array

Tags:

node.js

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?

like image 529
zoma.saf Avatar asked Feb 27 '15 12:02

zoma.saf


3 Answers

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]
  }
}
like image 126
Peter Herdenborg Avatar answered Oct 19 '22 18:10

Peter Herdenborg


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);
  }
}
like image 34
Anurag Peshne Avatar answered Oct 19 '22 20:10

Anurag Peshne


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};  
like image 26
Mr. Simplicity Avatar answered Oct 19 '22 18:10

Mr. Simplicity