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 });
}
};