0

I'm just starting with node.js and I'm encountering some troubles with the CRUD particularly with the PUT method to update the data in MongoDb.

In my terminal I've got the error appears with :

  • in the update function,

  • in the follow function

    node:events:368 throw er; // Unhandled 'error' event ^

    Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:371:5) at ServerResponse.setHeader (node:_http_outgoing:576:11) at ServerResponse.header (/Documents/BookFace/server/node_modules/express/lib/response.js:776:10) at ServerResponse.send (/Documents/BookFace/server/node_modules/express/lib/response.js:170:12) at ServerResponse.json (/Documents/BookFace/server/node_modules/express/lib/response.js:267:15) at /Documents/BookFace/server/controllers/user.controller.js:75:37 at /Documents/BookFace/server/node_modules/mongoose/lib/model.js:4961:18 at processTicksAndRejections (node:internal/process/task_queues:78:11) Emitted 'error' event on Function instance at: at /Documents/BookFace/server/node_modules/mongoose/lib/model.js:4963:15 at processTicksAndRejections (node:internal/process/task_queues:78:11) { code: 'ERR_HTTP_HEADERS_SENT' }

Here is the code :

const UserModel = require('../models/user.model')
const ObjectID = require('mongoose').Types.ObjectId

module.exports.getAllUsers = async (req, res) => {
    //send all details about all users except the password
    const users = await UserModel.find().select('-password') 
    res.status(200).json(users)
}

module.exports.userInfo = (req, res) => {
    //params = the param which is written into the url
    /* console.log(req.params) */
    if (!ObjectID.isValid(req.params.id))
    return res.status(400).send('Id unknown : ' + req.params.id)

    UserModel.findById(req.params.id, (err, docs) => {
        if (!err) res.send(docs)
        else console.log('ID unknown : ' + err)
    }).select('-password')
}

module.exports.updateUser = async (req, res) => {
    if (!ObjectID.isValid(req.params.id))
      return res.status(400).send("ID unknown : " + req.params.id);
  
    try {
      await UserModel.findOneAndUpdate(
        { _id: req.params.id },
        {
          $set: {
            bio: req.body.bio,
          },
        },
        { new: true, upsert: true, setDefaultsOnInsert: true },
        (err, docs) => {
          if (!err) return res.send(docs);
          if (err) return res.status(500).send({ message: err });
        }
      );
    } catch (err) {
      return res.status(500).json({ message: err });
    }
  }

  module.exports.deleteUser = async (req, res) => {
    if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);

    try {
        await UserModel.deleteOne({ _id: req.params.id }).exec()
        res.status(200).json( { message: 'succefully deleted.'})
    }

    catch(err){
        return res.status(500).json({message: err})
    }
  }

  module.exports.follow = async (req, res) => {
    if (
      !ObjectID.isValid(req.params.id) ||
      !ObjectID.isValid(req.body.idToFollow)
    )
      return res.status(400).send("ID unknown : " + req.params.id);
  
    try {
      // add to the follower list
      await UserModel.findByIdAndUpdate(
        //id of the user
        req.params.id,
        //id of the user to follow
        { $addToSet: { following: req.body.idToFollow } },
        { new: true, upsert: true },
        (err, docs) => {
          if (!err) res.status(201).json(docs);
          else return res.status(400).json(err);
        }
      );
      //add to following list of the user followed
      await UserModel.findByIdAndUpdate(
        req.body.idToFollow,
        { $addToSet: { followers: req.params.id } },
        { new: true, upsert: true },
        (err, docs) => {
          // if (!err) res.status(201).json(docs);
          if (err) return res.status(400).json(err);
        }
      );
    } catch (err) {
      return res.status(500).json({ message: err });
    }
  };
  • Does this answer your question? [ERR\_HTTP\_HEADERS\_SENT: Cannot set headers after they are sent to the client](https://stackoverflow.com/questions/52122272/err-http-headers-sent-cannot-set-headers-after-they-are-sent-to-the-client) – Heartbit Jan 10 '22 at 19:50

1 Answers1

0
module.exports.follow = async (req,res) => {
    if (!ObjectID.isValid(req.params.id) || !ObjectID.isValid(req.body.idToFollow))
    return res.status(400).send('ID unknown : ' + req.params.id);
try {
    // add to the follower list
    await UserModel.findByIdAndUpdate(
        req.params.id,
        {$addToSet: {following: req.body.idToFollow}},
        {new:true,upsert:true})
        
        //(err,docs)=> {
           // if (!err) res.status(201).json(docs);
            //else return res.status(400).json(err);
        //}

    .then((docs) => res.send(docs))
    .catch((err) => res.status(500).send({message:err}));
    // add to following list
    await UserModel.findByIdAndUpdate(
        req.body.idToFollow,
        {$addToSet: {followers: req.params.id}},
        {new:true,upsert:true})
        .catch((err) => res.status(500).send({message:err}));
} catch(err) {
    return res.status(500).json({message:err});
}
};