Kamlesh Yadav
Kamlesh Yadav

Reputation: 33

Cannot set headers after they are sent to the client error is showing

Error is showing if a user is already exiting. The error is not showing if the user does not exist in the database Plz tell me if there is any better way to check the username thank you in advance

exports.updateUser = async(req, res) => {
        if (req.body.userId === req.params.id) {
            if (req.body.userName || req.body.email) {
                await User.findOne({
                    $or: [{
                        email: req.body.email
                    }, {
                        username: req.body.userName
                    }]
                }).exec((err, user) => {
                    if (err) {
                        return res.status(500).json(err);
                    } else if (user) {
                        if (user.username === req.body.userName) {
                            return res.status(400).json({ error: "User Name already exists" });
                            //err = "User Name already exists";
                        } else {
                            return res.status(400).json({ error: "Email already exists" });
                        }
    
                    }
                })
    
            }
            if (req.body.password) {
                const salt = await bcrypt.genSalt(10);
                req.body.password = await bcrypt.hash(req.body.password, salt);
            }
            await User.findByIdAndUpdate(
                req.params.id, { $set: req.body }, { new: true }
            ).exec((err, user) => {
                if (err) {
                    return res.status(500).json(err);
                }
                if (user) {
                    return res.status(200).json("User Updated successfully!"); // here error is showing.
                }
            });
    
    
        } else {
            res.status(401).json("You can update only your account!");
        }
    };

Upvotes: 0

Views: 109

Answers (1)

Rahul Sharma
Rahul Sharma

Reputation: 10111

Don't send response inside exec, because if after sending response it'll execute rest of the code and try to send a response but response is already sent.

exports.updateUser = async (req, res) => {
  try {
    if (req.body.userId === req.params.id) {
      if (req.body.userName || req.body.email) {
        await User.findOne({
          $or: [
            {
              email: req.body.email,
            },
            {
              username: req.body.userName,
            },
          ],
        }).exec((err, user) => {
          if (err) {
            throw {
              code: 400,
              error: err,
            };
          } else if (user) {
            if (user.username === req.body.userName) {
              throw {
                code: 400,
                error: { error: "User Name already exists" },
              };
            }
            throw {
              code: 400,
              error: "Email already exists",
            };
          }
        });
      }
      if (req.body.password) {
        const salt = await bcrypt.genSalt(10);
        req.body.password = await bcrypt.hash(req.body.password, salt);
      }
      await User.findByIdAndUpdate(
        req.params.id,
        { $set: req.body },
        { new: true }
      ).exec((err, user) => {
        if (err) {
          throw {
            code: 500,
            error: err,
          };
        }
        if (user) {
          return res.status(200).json("User Updated successfully!"); // here error is showing.
        }
      });
    } else {
      throw {
        code: 401,
        error: "You can update only your account!",
      };
    }
  } catch (e) {
    res.status(e.code).json(e.error);
  }
};

Upvotes: 1

Related Questions