Bonjour,
Je suis en train de me former à Node.js et je fais face à un problème que je ne comprends pas.
Je déclare la fonction suivante dans un fichier model :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
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).send({message:err})
    }
}
Lorsque cette fonction est appelée, je récupère ceci dans mon postman :

{
"message":{
"originalStack": "Error
at model.Query._wrappedThunk [as _findOneAndUpdate] (/Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/mongoose/lib/helpers/query/wrapThunk.js:25:28)
at /Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/kareem/index.js:279:20
at _next (/Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/kareem/index.js:103:16)
at /Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/kareem/index.js:508:38
at processTicksAndRejections (node:internal/process/task_queues:78:11)"
}
}
Et dans la console :

node:events:371
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:573:11)
at ServerResponse.header (/Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/express/lib/response.js:158:21)
at /Users/stephane/IdeaProjects/tutorials/mern-project/controllers/user.controller.js:34:38
at /Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/mongoose/lib/model.js:4912:18
at processTicksAndRejections (node:internal/process/task_queues:78:11)
Emitted 'error' event on Function instance at:
at /Users/stephane/IdeaProjects/tutorials/mern-project/node_modules/mongoose/lib/model.js:4914:15
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
code: 'ERR_HTTP_HEADERS_SENT'
}
En revanche, si je remplace cette ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
await UserModel.findOneAndUpdate(
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
UserModel.findOneAndUpdate(
Ca fonctionne!
Je comprends que j'ai une erreur dans mon utilisation de l'appel asynchrone qui déclenche une réponse d'erreur (celle recue par postman), et que du coup le second envoi de réponse explicite (res.send(docs)) envoie l'erreur présente dans la console.

Dans tous les cas, l'update est fait dans MongoDB.

Je suis un peu perdu alors si quelqu'un a la gentillesse de m'expliquer ou de me mettre sur la voie, ca serait super sympa.
Stéphane