TypeError:callback.apply不是函数(Node.js和Mongodb)

Che*_*ang 5 javascript callback mongoose mongodb node.js

当我添加"{upsert:true}"行时,我收到此错误:

TypeError:callback.apply不是函数

// on routes that end in /users/competitorAnalysisTextData
// ----------------------------------------------------
router.route('/users/competitorAnalysisTextData/:userName')

    // update the user info (accessed at PUT http://localhost:8080/api/users/competitorAnalysisTextData)
    .post(function(req, res) {

        // use our user model to find the user we want
        User.findOne({ userName: req.params.userName}, function(err, user) {

            if (err)
                res.send(err);

            console.log('user.competitorAnalysis.firstObservation: %@', user.competitorAnalysis.firstObservation);
            // Got the user name
            var userName = user.userName;
            // update the text data
            console.log('Baobao is here!');
            user.update(
                {
                    userName: 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 }
            );

            // save the user
            user.save(function(err) {
                if (err)
                    return res.send(err);

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

        });
    })
Run Code Online (Sandbox Code Playgroud)

没有这一行,就没有错误.我是nodejs的新手,不太确定问题出在哪里.

更新

现在没有错误消息,但数据库的这一部分未使用新数据更新.嵌入的文档仍然是空的.

// on routes that end in /users/competitorAnalysisTextData
// ----------------------------------------------------
router.route('/users/competitorAnalysisTextData/:userName')

// update the user info (accessed at PUT http://localhost:8080/api/users/competitorAnalysisTextData)
.post(function(req, res) {

    console.log('1');

    // Just give instruction to mongodb to find document, change it;
    // then finally after mongodb is done, return the result/error as 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
            console.log('2');
            // now you can send the error or updated file to client
            if (err)
                return res.send(err);

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

})
Run Code Online (Sandbox Code Playgroud)

vdj*_*j4y 11

有两种方法可以更新mongodb中的文档:

  1. 找到文档,将其带到服务器,更改它,然后将其保存回mongodb.

  2. 只是给mongodb指令找到文件,改变它; 然后在mongodb完成后最终返回结果/错误作为回调.

在您的代码中,您将混合使用这两种方法.


  1. 使用user.save(),首先使用user.findOne搜索数据库,然后将其拉到服务器(nodejs),现在它就存在于您的计算机内存中.然后你可以手动更改数据,最后用user.save()将其保存到mongodb

    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!' });
        });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二个是使用User.findOneAndUpdate()..这是首选,而不是user.findOne()然后user.update(); 因为那些基本上两次搜索数据库.首先找到一个(),再次搜索更新()

无论如何,第二种方法是告诉mongodb更新数据而不首先引入服务器,接下来,只有在mongodb完成其操作后,您才会收到更新文件(或错误)作为回调

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!' });
        });
Run Code Online (Sandbox Code Playgroud)