IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Utiliser async/await


Sujet :

NodeJS

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    mai 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Utiliser async/await
    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

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    mai 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    J'ai retiré le callback et j'ai remplacé le code par celui-ci

    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
     
    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}
            )
                .then((docs) => {return res.send(docs)})
                .catch((err) => {return res.status(500).send({message: err})})
        }
        catch (err) {
            return res.status(500).send({message:err})
        }
    }
    Maintenant ca fonctionne mais si quelqu'un peut m'expliquer pourquoi ca m'aiderait beaucoup.
    Merci

Discussions similaires

  1. Utiliser async/await sur une Promise (winsc)
    Par Tillt dans le forum NodeJS
    Réponses: 6
    Dernier message: 23/04/2021, 14h03
  2. Réponses: 11
    Dernier message: 21/05/2014, 09h41
  3. [C#] Différence Async, Await, MultiThreading
    Par same66 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/03/2013, 09h25
  4. Réponses: 2
    Dernier message: 13/03/2013, 19h16
  5. Async/Await avec Silverlight & WCF
    Par Joffrey Kern dans le forum Silverlight
    Réponses: 5
    Dernier message: 24/05/2012, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo