MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

TypeError:callback.apply non è una funzione (Node.js e Mongodb)

Esistono 2 modi per aggiornare i documenti in mongodb:

  1. trova il documento, portalo sul server, modificalo, quindi salvalo di nuovo su mongodb.

  2. basta dare istruzioni a mongodb per trovare il documento, cambiarlo; quindi, infine, dopo che mongodb è terminato, restituisci il risultato/errore come callback.

Nel tuo codice stai mescolando entrambi i metodi.

  1. con user.save(), prima cerchi nel database con user.findOne e lo trascini sul server (nodejs), ora risiede nella memoria del tuo computer. Quindi puoi modificare manualmente i dati e infine salvarli su mongodb con user. salva()

    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. il secondo è usare User.findOneAndUpdate().. Questo è preferito, invece di user.findOne() quindi user.update(); perché quelli in pratica cercano due volte il database. prima per findOne() e cerca di nuovo per update()

Ad ogni modo, il secondo metodo è dire a mongodb di aggiornare i dati senza prima portarli sul server, quindi, solo dopo che mongodb avrà terminato la sua azione, riceverai il file aggiornato (o errore) come callback

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!' });
        });