MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

TypeError :callback.apply n'est pas une fonction (Node.js &Mongodb)

Il existe 2 façons de mettre à jour des documents dans mongodb :

  1. trouvez le document, apportez-le au serveur, modifiez-le, puis enregistrez-le dans mongodb.

  2. donnez simplement des instructions à mongodb pour trouver le document, modifiez-le; puis enfin une fois mongodb terminé, renvoyez le résultat/l'erreur en tant que rappel.

Dans votre code, vous mélangez les deux méthodes.

  1. avec user.save(), vous recherchez d'abord la base de données avec user.findOne et vous l'extrayez vers le serveur (nodejs), maintenant il vit dans la mémoire de votre ordinateur. Ensuite, vous pouvez modifier manuellement les données et enfin les enregistrer dans mongodb avec l'utilisateur. enregistrer()

    User.findOne({ userName: req.params.userName}, function(err, user) {
    
        if (err)
            res.send(err);
    
        //this user now lives in your memory, you can manually edit it
        user.username = "somename";
        user.competitorAnalysis.firstObservation = "somethingelse";
    
        // after you finish editing, you can save it to database or send it to client
         user.save(function(err) {
            if (err)
                return res.send(err);
    
            return res.json({ message: 'User updated!' });
        });
    
  2. la seconde consiste à utiliser User.findOneAndUpdate().. Ceci est préféré, au lieu de user.findOne() puis user.update(); parce que ceux qui recherchent essentiellement la base de données deux fois. d'abord pour findOne(), et recherchez à nouveau pour mettre à jour()

Quoi qu'il en soit, la deuxième méthode indique à mongodb de mettre à jour les données sans les amener au serveur. Ensuite, seulement après que mongodb ait terminé son action, vous recevrez le fichier mis à jour (ou l'erreur) en tant que rappel

User.findOneAndUpdate({ userName: req.params.userName}, 
            {
             $set: { "competitorAnalysis.firstObservation" : req.body.firstObservation,
                      "competitorAnalysis.secondObservation" : req.body.secondObservation,
                      "competitorAnalysis.thirdObservation" : req.body.thirdObservation,
                      "competitorAnalysis.brandName" : req.body.brandName,
                      "competitorAnalysis.productCategory" : req.body.productCategory
            } },
            { upsert: true },
        function(err, user) {
        //after mongodb is done updating, you are receiving the updated file as callback    

        // now you can send the error or updated file to client
        if (err)
            res.send(err);

        return res.json({ message: 'User updated!' });
        });