Пн goose не обновляет базу данных с помощью findByIdAndUpdate? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь обновить свою базу данных, используя findByIdAndUpdate через форму HTML, которая работает для всех, кроме вложенных данных (ePIMS, codeVersion и region все обновления без проблем). Когда я делаю console.log(req.body.environment.instance), он выводит данные, которые я набрал, как будто они проходят правильно, но по какой-то причине mongoDB не обновляется с информацией. Может кто-нибудь выяснить, что я делаю неправильно?

mon goose схема:

var environmentSchema = new mongoose.Schema({
    ePIMS: String,
    codeVersion: String,
    region: String,
    /*instance and testEnv don't seem to update in the database*/
    HCHC: {
      instance: String,
      testEnv: String
    }
  });

форма, которую я использую для обновления:

    <form action="/environments/<%= environment._id %>?_method=PUT" method="POST">
        <input class="form-control" type="text" name="environment[ePIMS]" placeholder="ePIMS" value="<%= environment.ePIMS %>" />
        <input class="form-control" type="text" name="environment[region]" placeholder="Region" value="<%= environment.region %>" />

        <input class="form-control" type="text" name="environment[instance]" placeholder="HCHC Instance" value="<%= environment.instance %>" />
        <input class="form-control" type="text" name="environment[testEnv]" placeholder="Test Environment" value="<%= environment.testEnv %>" />
        <button class="btn btn-primary">Submit</button>
    </form>

edit и обновлять маршруты:

//Edit environment route
  router.get("/environments/:id/edit", function(req, res){
      Environment.findById(req.params.id, function(err, foundEnvironment){
          if(err){
              res.redirect("/");
          } else {
              res.render("edit", {environment: foundEnvironment});
          }
      });
  });

  //Update environment route
router.put("/environments/:id", function(req, res){
  Environment.findByIdAndUpdate(req.params.id, req.body.environment, function(err, updatedEnvironment){
    if (err) {
      res.redirect("/environments");
    } else {
      res.redirect("/environments");
      //console.log(req.body.environment.instance)
    }
  });
});

ОБНОВЛЕНИЕ: РЕШЕНИЕ Спасибо, Наян, за вашу помощь!

Я изменил маршрут обновления следующим образом:

 //Update environment route
router.put("/environments/:id", function(req, res){
  var data = {
    HCHC : {
      instance: req.body.instance,
      testEnv: req.body.testEnv
    }
  }
  Environment.findByIdAndUpdate(req.params.id, {$set: data}, function(err, updatedEnvironment){
    if (err) {
      res.redirect("/environments");
    } else {
      res.redirect("/environments");
    }
  });
});

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Вы отправляете различные структуры тела и устанавливаете его непосредственно в findOneAndUpdate (), чтобы он не работал, если структура отличается.

Возможное решение, которое вы можете применить, - изменить тело запроса. выглядеть примерно так:

"environment" : {
    "ePIMS" : value,
    "codeVersion" : value,
    "region" : value,
    "HCHC": {
        "instance" : value,
        "testEnv" : value
    }
}

Или вы можете вывести две вещи и testEnv из HCH C, если хотите.

В любом случае убедитесь, что у вас такая же структура, если вы передаете тело непосредственно в функцию.

Другое решение

создать локальную переменную для исправления структуры и передать ее в функцию, например:

router.put("/environments/:id", function(req, res){
  let body = req.body.environment
  let bodyData = {
    ePIMS: body.ePIMS,
    codeVersion: body.codeVersion,
    region: body.region,
    HCHC: {
      instance: body.instance,
      testEnv: body.testEnv
    }
  }
  Environment.findByIdAndUpdate(req.params.id, bodyData, function(err, updatedEnvironment){
    if (err) {
      res.redirect("/environments");
    } else {
      res.redirect("/environments");
      //console.log(req.body.environment.instance)
    }
  });
});
1 голос
/ 28 апреля 2020

это решение сработало для меня:

router.patch('/tasks/:id', async (req,res)=>{



    try{
        const task= await Task.findByIdAndUpdate(req.params.id,req.body,{new:true,runValidators:true})

        if(!task)
        {
            res.status(404).send()
        }
    res.send(task)    
    }
    catch(e)
    {
        res.status(500).send()
    }
})

однако, мое окончательное решение включало проверку корректирующих дополнений без использования findByIdAndUpdate:

router.patch('/tasks/:id', async (req,res)=>{ 
//validate update operation  


const updates=Object.keys(req.body)
  const allowedUpdates= ['description','completed']
  const isInvalidOperation= updates.every((update)=>allowedUpdates.includes(update))




  if(!isInvalidOperation)
  {
     return res.status(400).send({error:'invalid updates'})
  }


  try{
      const task= await Task.findById(req.params.id)
      updates.forEach((update)=>task[update]=req.body[update])
      await task.save()

      if(!task)
      {
          res.status(404).send()
          }
      res.send(task)    
      }
      catch(e)
      {
          res.status(500).send()
      }
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...