loading...

Updating data: Put, Patch and Delete HTTP Verbs

mtee profile image Margaret W.N ・2 min read

Put

Put replaces a resource with another. It takes two parameters same as Post and Get verbs. We start by finding the resource by id using mongoose findById method.

studentRouter.route('/students/:studentId')
  .patch((req, res) => {
    //find resource by id
    Student.findById(req.params.studentId, (err, student) => {
      if (err) {
        return res.send(err);
      }
    });
  });

Next we access the existing properties and replace them with the incoming changes

studentRouter.route('/students/:studentId')
  .put((req, res) => {
    //find resource by id
    Student.findById(req.params.studentId, (err, student) => {
      if (err) {
        return res.send(err);
      }

      //Access existing properties and Update resource properties
      student.firstName = req.body.firstName;
      student.lastName = req.body.lastName;
      student.major = req.body.major;
    });
  });

Lastly we save and return the data or an error.

studentRouter.route('/students/:studentId')
  .put((req, res) => {
    //find resource by id
    Student.findById(req.params.studentId, (err, student) => {
      if (err) {
        return res.send(err);
      }
      //Update resource properties
      student.firstName = req.body.firstName;
      student.lastName = req.body.lastName;
      student.major = req.body.major;

      //save and return data or an error
      student.save( (err) => {
        if (err) {
          return res.send(err)
        }
        return res.json(student);
      });

    });
  });

Suppose we want to change some properties of a resource in place of replacing the entire resource, Patch would be the better alternative.

Patch

With patch we can update one or more properties of a resource. We check if the property exists and replace it with the the incoming changes.

studentRouter.route('/students/:studentId')
  .patch((req, res) => {
    Student.findById(req.params.studentId, (err, student) => {
      if (err) {
        return res.send(err);
      }
      //Update one property
      if (req.body.firstName) {
        student.firstName = req.body.firstName;
      }
    });
  });


In a case where we have to update multiple properties, this quickly becomes tedious and redundant. An alternative is to use Object.entries( ) method to return an array of key, value pairs. We can then chain a forEach( ) method to loop through the array and update existing properties.

studentRouter.route('/students/:studentId')
  .patch((req, res) => {
    Student.findById(req.params.studentId, (err, student) => {
      if (err) {
        return res.send(err);
      }
      //Code to prevent us from updating the id
      if (req.body._id) {
        delete req.body._id;
      }

      //The alternative
      Object.entries(req.body).forEach((item) => {
        const key = item[0];
        const value = item[1];
        student[key] = value;
      })

      //save and return data or an error
      student.save((err) => {
        if (err) {
          return res.send(err)
        }
        return res.json(student);
      });

    });
  });

NB: A resource id is a unique identifier of the resource, we wouldn't want to change that. To prevent that we can delete any incoming updates to the Id. That's why we included following code.

//Code to prevent us from updating the id
    if (req.body._id) {
      delete req.body._id;
    }

Delete

Delete completely removes a resource.

 studentRouter.route('/students/:studentId')
  .delete((req, res) => {
    //find resource by id
    Student.findById(req.params.studentId, (err, student) => {
      if (err) {
        return res.send(err);
      }

      student.remove((err) => {
        if (err) {
          return res.send(err);
        }
        return res.sendStatus(204);
      })
    });
  });

A key thing to note is that the findById redundant. Try creating middleware to handle that.

It's a wrap for Day 7!

Posted on by:

mtee profile

Margaret W.N

@mtee

Developer | GADs 20 scholar | Diving into backend

Discussion

markdown guide