使用Express,不可变的cross _id字段错误将/ Update更新到我的MongoDb

时间:2018-04-14 23:48:26

标签: mongodb express immutability put

所以我发送任务数据,开始日期和结束日期。但是我无法对数据库进行任何更改,因为它认为我使用mongoDB获得了一个不可变的错误...我想坚持使用.then方法来获取我的js代码。

我的其他方法工作正常,我只是无法正确使用此更新方法...

app.put('/missions/:id', function (req, res) {
  if (req.user) {
    model.Mission.findById(req.params.id).then(function(Mission){
      console.log("req.body.secret_mission: ",req.body.secret_mission)
      Mission['secret_mission'] = req.body.secret_mission;
      Mission['start'] = req.body.start;
      Mission['complete'] = req.body.complete;

      Mission.update().then(function(){
        res.set('Access-Control-Allow-Origin', '*');
        res.sendStatus(201);
      });
  });
}else{
    res.sendStatus(401);
  }
});

Error I receive in the command line

2 个答案:

答案 0 :(得分:1)

我能够使用所提供的所有帮助来提供可行的解决方案,并与我如何调用其余代码保持一致。对那些回复的人表示谢谢

不是事先在我的集合中设置元素,而是应该在更新请求中执行此操作。我没有调用2个方法,而是使用了findOneAndUpdate。

app.put('/missions/:id', function (req, res) {
  if (req.user) {
    model.Mission.findOneAndUpdate(
      {'_id' : req.params.id},
      { $set: {"secret_mission" : req.body.secret_mission,
              "start" : req.body.start},
              "complete" : req.body.complete
      }).then(function(err, missions){
      if (err) return res.json({Error: err});
        res.json(missions);
    });
  } else {
    res.sendSatus(401);
  }
});

答案 1 :(得分:0)

我已经清理了你的代码:

  1. 删除req.user检查中间件,
  2. 包含cors模块,不在每个处理程序中使用CORS标头
  3. 使用async/await内容为其提供更多同步外观
  4. mission/:id路由处理程序只是具有没有垃圾的具体逻辑
  5. 检查此解决方案:

    const cors = require('cors'); // install: npm i --save cors
    const _ = require('lodash'); // install:  npm i --save lodash
    
    app.use(cors());
    
    const isUserAuthorized = (req, res, next) => {
      if (!req.user) return res.status(401).send();
      next();
    }
    
    app.put(
      '/missions/:id', 
      isUserAuthorized, 
      async (req, res) => {
        try {
          const mission = await model.Mission.findById(req.params.id);
          if (!mission) return res.status(404).send();
    
          mission.set(_.pick(req.body, ['secret_mission', 'start', 'complete']);
          await mission.save();
    
          res.status(201).send();
        }
        catch (error) {
          console.log(error);
          res.status(500).send();
        }
      });
    

    或者如果您不关心db中的记录是否存在,那么您可以直接推送更新:

    app.put(
      '/missions/:id', 
      isUserAuthorized, 
      async (req, res) => {
        try {
          const data = _.pick(req.body, ['secret_mission', 'start', 'complete']);
    
          await model.Mission.update({_id: req.params.id}, {$set: data});
    
          res.status(201).send();
        }
        catch (error) {
          console.log(error);
          res.status(500).send();
        }
      });