2017-10-12 1 views
0

Le but de ce programme est d'ajouter une propriété appelée 'userResponse' aux objets de problème qui reflètent l'entrée de l'utilisateur. L'objet problème dans Mongo DB est maintenu dans un tableau d'objets, appelés « problèmes », qui se tient dans un objet appelé « session »:Mise à jour des entrées de la base de données Mongo par les paramètres

{ 
    "_id" : ObjectId("59df5ee7adb378237377dbb4"), 
    "updatedAt" : ISODate("2017-10-12T12:24:07.269Z"), 
    "createdAt" : ISODate("2017-10-12T12:24:07.269Z"), 
    "userId" : "59df5edbadb378237377dbb3", 
    "problems" : [ 
     { 
      "correctResponse" : 23, 
      "problem" : "20 + 3", 
      "secondTerm" : 3, 
      "firstTerm" : 20 
       } ] 
} 

Voici la logique du point de terminaison que j'ai utilisé:

router.patch('/session/:sessionId/:index', passport.authenticate('jwt', { session: false }), (req, res) => { 
    Session.findOne({_id: req.params.sessionId}) 
    .then((item)=>{ 
     item.problems[req.params.index].userResponse = req.body.userResponse; 
     Session.update({_id: req.params.sessionId}, item).then((updated)=>{ 
      res.json(updated.problems[req.params.index]); 
     }); 
    }) 

}) 

J'ai regardé quelques autres exemples (onetwo), mais ils ne semblent pas relavant puisque c'est un patch pour des éléments individuels du tableau identifiés par les params.

Cette approche fonctionne, en ce qu'elle met à jour avec succès la base de données avec les nouvelles propriétés sur les objets, mais lors de l'exécution des journaux de serveur cette erreur:

(node:10955) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property '0' of undefined 

je crois comprendre que cela signifie que l'objet ne peut pas être trouvé dans la base de données à un moment donné, mais comme la base de données inclut les nouvelles propriétés, elle doit être résolue plus tard. Est-ce corrrect?

De plus, il semble fragile d'avoir deux promesses enchaînées sans déclarations de capture ...

Quelqu'un peut-il offrir des suggestions sur la façon d'améliorer ce processus? Cette logique met à jour avec succès la base de données, avec des erreurs. Y a-t-il un meilleur moyen?

Nous vous remercions de votre temps.

Répondre

1

Eh bien je peux voir de multiples problèmes dans le code qui peuvent causer votre problème

1- De la structure de votre document de session de base de données _id est de type ObjectId et lorsque vous essayez de trouver, vous trouvez par la seule id qui est probablement chaîne que vous devrez utiliser ObjectId(req.params.sessionId)

2- de l'erreur, je peux dire que la valeur de item ne contient pas une série de problèmes ... donc items.problems est undefined si undefined[0] est une erreur. 3- Vous n'avez pas besoin de trouver l'élément de document de session deux fois pour mettre à jour le tableau, j'ai mis à jour le code pour mettre à jour la valeur userResponse dans le tableau en utilisant une seule opération de mise à jour.

4- pour une meilleure gestion des erreurs et le code maintenabilité vous devez gérer promise rejet de sorte que vous devez gérer catch aussi bien que vous faites avec then

donc des commentaires ci-dessus je peux mettre à jour votre code pour être

var mongoose = require('mongoose'); 
router.patch('/session/:sessionId/:index', passport.authenticate('jwt', { session: false }), (req, res) => { 
    var index = req.params.index; 
    Session.update({_id: mongoose.Types.ObjectId(req.params.sessionId) }, {$set : {"problems." + index + ".userResponse" : req.body.userResponse }) 
    .then((updated)=>{ 
     console.log(updated); 
     res.json(updated.problems[req.params.index]); 
    }) 
    .catch((err) => { 
     console.log(err.message); 
     res.json({status: "error" , message:err.message}); 
    }); 
}) 
+0

Excellent! Merci beaucoup pour votre temps, je suis nouveau à Mongo/Mongoose et c'est une grande aide. – Cameron

+0

Vous êtes les bienvenus :) ... heureux que cela ait aidé ... s'il vous plaît si cela répond à votre question, notez-le comme accepté ... –