Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

NODEJS: Error [ERR_HTTP_HEADERS_SENT]

Estou tomando esse erro no console após realizar um método post no postman:

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 (D:******\presentation-back-end\api\node_modules\express\lib\response.js:776:10)
        at ServerResponse.send (D:******\presentation-back-end\api\node_modules\express\lib\response.js:170:12)
        at ServerResponse.json (D:******\presentation-back-end\api\node_modules\express\lib\response.js:267:15)
        at file:///D:******/presentation-back-end/api/controllers/User.js:58:12
        at processTicksAndRejections (node:internal/process/task_queues:96:5) {
      code: 'ERR_HTTP_HEADERS_SENT'
    }

Ele não retorna app crashed, consigo usar o sistema normalmente, mas não faço ideia do que está causando o problema.

Método post:

router.post("/users", async (req, res) => {
  const { isAdmin, email, username, name, password, confirmpassword } =
    req.body;

  if (!name) {
    return res.status(422).json({ msg: "O nome é obrigatório!" });
  }

  if (!email) {
    return res.status(422).json({ msg: "O email é obrigatório!" });
  }

  if (!password) {
    return res.status(422).json({ msg: "A senha é obrigatória!" });
  }

  if (password != confirmpassword) {
    return res
      .status(422)
      .json({ msg: "A senha e a confirmação precisam ser iguais!" });
  }

  //CHECKS IF THE USER ALREADY EXISTS
  const userFound = await User.findOne(
    { email: email }
  )
  if (userFound) {
    return res.status(400).json({ msg: "usuário já existe" });
  }

  // CREATE ENCRYPTED PASSWORD
  const passwordHash = bcrypt.hashSync(password, 15);

  const createuser = new User({
    isAdmin,
    email,
    username,
    name,
    password: passwordHash,
  });

  try {
    createuser
      .save()
      .then((user) => {
        return res
          .status(201)
          .send({ data: user })
          .json({ msg: "Usuário criado com sucesso !" });
      })
      .catch((err) => {
        return console.log(err)
      });
  } catch (err) {
    return res.status(500).send({
      msg: "There was a problem adding the information to the database.",
      err,
    });
  }
});

CheckToken:

const checkToken = (req, res, next) => {
    const authHeader = req.headers["authorization"];
    const token = authHeader && authHeader.split(" ")[1];


    if (!token) return res.status(401).json({ msg: "Acesso negado!" });

    try {
        const secret = process.env.SECRET;

        jwt.verify(token, secret);

        next();
    } catch (err) {
        res.status(400).json({ msg: "O Token é inválido!" });
    }
};
2 respostas
solução!

Olá Jones tudo bem ?

Esse problema ocorre quando você retorna o response mais de uma vez, ou seja, no seu código bem provavel que esta caindo em um if dando o res e mesmo assim ele continua a executar o codigo e da um outro res. Você pode fazer o debug pela sua IDE ou adicionar alguns console.log() na sua controller pra saber por onde ela cai

Outro ponto que notei no seu código é quando vc salva um usuário return res.status(201).send({ data: user }).json({ msg: "Usuário criado com sucesso !" });

O correto seria: return res.status(201).json({ msg: "Usuário criado com sucesso !", data: user });

Obrigado, havia feito essa alteração e tinha dado certo ! O erro estava nesse res.send({data: user}) mesmo