sql >> Base de Datos >  >> NoSQL >> MongoDB

TypeError:callback.apply no es una función (Node.js y Mongodb)

Hay 2 formas de actualizar documentos en mongodb:

  1. encuentre el documento, tráigalo al servidor, cámbielo y luego guárdelo de nuevo en mongodb.

  2. simplemente dé instrucciones a mongodb para encontrar el documento, cámbielo; luego, finalmente, después de que mongodb haya terminado, devuelva el resultado/error como devolución de llamada.

En su código, está mezclando ambos métodos.

  1. con user.save(), primero busca en la base de datos con user.findOne y lo lleva al servidor (nodejs), ahora vive en la memoria de su computadora. Luego puede cambiar manualmente los datos y finalmente guardarlos en mongodb con el usuario. guardar()

    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. el segundo es usar User.findOneAndUpdate().. Esto es preferible, en lugar de user.findOne() y luego user.update(); porque esos básicamente buscan en la base de datos dos veces. primero para findOne(), y busque de nuevo para actualizar()

De todos modos, el segundo método le dice a mongodb que actualice los datos sin llevarlos primero al servidor. Luego, solo después de que mongodb termine con su acción, recibirá el archivo actualizado (o error) como devolución de llamada

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