11526 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

je m'entraine sur NODE en faisant un site de recherche d'emploi.
J'ai en revanche un petit soucis.
L'offre a été posté et il contient une table candidates. Lorsque via postman je simule la candidature cela fonctionne. Puis je voudrais que l'user ayant déposé une candidature est lui aussi une trace de ses candidatures. Du coup l'user contient une table candidacies.
Les insertions dans les deux tables fonctionnes mais j'ai un soucis avec le callback. Il me renvoi
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
lorsque je supprime mon callback je n'ai aucune erreur de renvoyé vu qu'il n'y a pas de res. Comment faire pour réctifier ça ?


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

  try {
    PostModel.findByIdAndUpdate(
      req.params.id,
      {
        $push: {
          candidates: {
            candidateId: req.body.candidateId,
            candidateName: req.body.candidateName,
            candidateFirstname: req.body.candidateFirstname,
            candidateCv: req.body.candidateCv,
            timestamp: new Date().getTime(),
          },
        },
      },
      { new: true },
      (err, docs) => {
        if (!err) res.send(docs);
        else res.status(400).send(err);
      }
    );

    UserModel.findByIdAndUpdate(
      req.body.candidateId,
      {
        $addToSet: { candidacies: req.params.id },
      },
      { new: true, upsert: true },
      (err, docs) => {
        if (!err) res.status(200).json(docs);
        return res.status(400).send(err);
      }
    );
  } catch (err) {
    res.status(400).send(err);
  }
};


Merci d'avance
Modérateur
Bonjour,

Il manque probablement des return; (après les .send() qui n'en ont pas déjà ?).

Amicalement,
Merci pour votre réponse.

Alors où mettre les return. Parce-que j'ai déjà essayé sans succès de mettre un return après les conditions mais ça n'a rien changé. Mais le soucis vient avec certitude du callback de la partie UserModel parce-que j'ai d'abord testé PostModel avant de faire UserModel et ça fonctionnait très bien. Et en commentant ce qu'il y a dans le callback ça fonctionne aussi
Modérateur
Bonjour,

On ne peut pas faire un diagnostic précis pour ce problème avec seulement des bouts de code (selon moi).

Amicalement,
Modérateur
Bonjour,

Déjà, tu utilises quoi comme modules ? Parce que node.js, c'est vaste. Chacun fait sa petite cuisine.

Ton code semble utiliser mongoose (que je n'utilise pas). Est-ce le cas ?

Idéalement, il faudrait un exemple de code minimal mais complet qui reproduit le problème (ce qui veut dire au moins un index.js réduit et un script affichant une page).

Amicalement,
Alors oui en effet j'utilise mongoose.
En ce qui concerne le script affichant une page, je n'en ai pas. Mes essais je l'ai fait avec postman.
Voici la route concernant la logique

router.patch("/candidacy/:id", postController.candidacy);

et l'index

const express = require("express");
const cookieParser = require("cookie-parser");
const userRoutes = require("./routes/user.routes");
const postRoutes = require("./routes/post.routes");
require("dotenv").config({ path: "./config/.env" });
require("./config/db");
const { checkUser, requireAuth } = require("./middlewares/auth.middleware");
const cors = require("cors");

const app = express();

const corsOptions = {
  origin: process.env.CLIENT_URL,
  credentials: true,
  allowedHeaders: ["sessionId", "Content-Type"],
  exposedHeaders: ["sessionId"],
  methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
  preflightContinue: false,
};
app.use(cors(corsOptions));

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

app.get("*", checkUser);
app.get("/jwtid", requireAuth, (req, res) => {
  res.status(200).send(res.locals.user._id);
});

app.use("/api/user", userRoutes);
app.use("/api/post", postRoutes);

app.listen(process.env.PORT, () => {
  console.log(`Listening on port ${process.env.PORT}`);
});


Par rapport à ce code, je n'ai pas vraiment d'autre module lié. Ma version est la 6.0.13
Modifié par Don-pasqual (25 Nov 2021 - 08:58)