MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

TypeError:callback.apply não é uma função (Node.js e Mongodb)


Existem 2 maneiras de atualizar documentos no mongodb:

  1. encontre o documento, traga-o para o servidor, altere-o e salve-o novamente no mongodb.

  2. apenas dê instruções ao mongodb para encontrar o documento, altere-o; então, finalmente, depois que o mongodb for concluído, retorne o resultado/erro como retorno de chamada.

No seu código, você está misturando os dois métodos.

  1. com user.save(), primeiro você pesquisa o banco de dados com user.findOne, e o puxa para server(nodejs), agora ele vive na memória do seu computador. Então você pode alterar manualmente os dados e finalmente salvá-los no mongodb com user. Salve ()
    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. a segunda é usar User.findOneAndUpdate().. Isso é preferível, em vez de user.findOne() e depois user.update(); porque aqueles basicamente pesquisam o banco de dados duas vezes. primeiro para findOne() e pesquise novamente para atualizar()

De qualquer forma, o segundo método está dizendo ao mongodb para atualizar os dados sem primeiro trazer para o servidor, em seguida, somente após o mongodb terminar com sua ação, você receberá o arquivo atualizado (ou erro) como retorno de chamada
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!' });
        });