Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Req.body is not iterable in node.js

I am building mock restful API to learn better. I am using MongoDB and node.js, and for testing I use postman.

I have a router that sends update request router.patch. In my DB, I have name (string), price (number) and imageProduct (string - I hold the path of the image).

I can update my name and price objects using raw-format on the postman, but I cannot update it with form-data. As I understand, in raw-form, I update the data using the array format. Is there a way to do it in form-data? The purpose of using form-data, I want to upload a new image because I can update the path of productImage, but I cannot upload a new image public folder. How can I handle it?

Example of updating data in raw form

[ {"propName": "name"}, {"value": "test"}]

router.patch

router.patch('/:productId', checkAuth, (req, res, next) => {
const id = req.params.productId;

const updateOps = {};

for (const ops of req.body) {
    updateOps[ops.propName] = ops.value;
}
Product.updateMany({_id: id}, {$set: updateOps})
    .exec()
    .then(result => {
        res.status(200).json({
            message: 'Product Updated',
            request: {
                type: 'GET',
                url: 'http://localhost:3000/products/' + id
            }
        });
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({
            err: err
        });
    });
});
like image 437
Kaan Taha Köken Avatar asked Sep 04 '18 12:09

Kaan Taha Köken


People also ask

What is req body in node JS?

The req. body object allows you to access data in a string or JSON object from the client side. You generally use the req. body object to receive data through POST and PUT requests in the Express server.

IS REQ body an array?

body can't be read as an array. Save this question.

Can we use req body with GET request?

Server semantics for GET, however, are restricted such that a body, if any, has no semantic meaning to the request. The requirements on parsing are separate from the requirements on method semantics. So, yes, you can send a body with GET, and no, it is never useful to do so.


2 Answers

Using for...of is a great idea, but you can't use it like you are to loop through an object's properties. Thankfully, Javascript has a few new functions that turn 'an object's properties' into an iterable.

Using Object.keys:

const input = {
  firstName: 'Evert',
} 
for (const key of Object.keys(input)) {
  console.log(key, input[key]);
}

You can also use Object.entries to key both the keys and values:

const input = {
  firstName: 'Evert',
} 
for (const [key, value] of Object.entries(input)) {
  console.log(key, value);
}
like image 107
Evert Avatar answered Sep 25 '22 18:09

Evert


I know this answer might be too late to help you but it might help someone in 2020 and beyond.

First, comment out this block:

//const updateOps = {};

//for (const ops of req.body) {
//updateOps[ops.propName] = ops.value;
//}

and change this line:

Product.updateMany({_id: id}, {$set: updateOps})

to this:

Product.updateMany({_id: id}, {$set: req.body})

Everything else is fine. I was having similar issues, but this link helped me: [What is the difference between ( for... in ) and ( for... of ) statements in JavaScript?

like image 24
Sage Hassan Avatar answered Sep 21 '22 18:09

Sage Hassan