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

当我添加行“{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!' }); }); }); }) 

没有这条线,就没有错误。 我是nodejs的新手,不太清楚问题出在哪里。

更新

现在没有错误消息,但数据库的这部分不会更新新的数据。 embedded的文件仍然是空的。

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

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

  1. find文件,把它带到服务器,改变它,然后把它保存回到mongodb。

  2. 只要指示mongodb找文件,改一下; 那么在MongoDB完成后,返回结果/错误作为callback。

在你的代码中,你正在混合这两种方法。


  1. 用user.save(),首先你用user.findOnesearch数据库,然后把它拉到服务器(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!' }); }); 
  2. 第二个是使用User.findOneAndUpdate()。这是首选,而不是user.findOne()然后user.update(); 因为那些基本上search数据库两次。 先find一个(),然后再次searchupdate()

无论如何,第二种方法是告诉mongodb更新数据,而不是首先引入服务器。接下来,只有在mongodb完成其操作之后,才会收到更新后的文件(或错误)作为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!' }); }); 

您忘记了通过callbackupdate方法

  user.update( { $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, result){} ); 

update方法需要3个参数。

  • 文件更新
  • 选项
  • 回电话