В поисках лучшего подхода для обновления один в Mongoose - PullRequest
0 голосов
/ 16 декабря 2018

Я все еще новичок в мангусте в целом.Я создаю свое приложение для блогов, которое имеет бэкэнд на основе Node и MongoDB, я использую Angular для внешнего интерфейса.

Я создаю свой Restful API, который должен позволять пользователю нажимать на сообщение и обновлять его.Однако я точно не знаю, правильно ли я делаю это здесь.

Это схема для моего поста:

const mongoose = require('mongoose');

// Schema Is ONly bluePrint
var postSchema = mongoose.Schema({
  title: {type: String, required: true },
  content: {type: String, required: true},
}, {timestamps: true});

module.exports =  mongoose.model("Post", postSchema);

В моем угловом сервисе у меня есть этофункция, чтобы помочь мне отправить запрос http на мой бэкэнд-сервер, идентификатор для этой функции берется из бэкэнда mongoDB, заголовок и содержимое из формы на странице

  updatePost(id: string, title: string, content: string) {
    console.log('start posts.service->updatePost()');
    const post: Post = {
      id: id,
      title: title,
      content: content
    };
    this._http.put(`http://localhost:3000/api/posts/${id}`, post)
      .subscribe(res => console.log(res));
  }

Мне кажется, что естьпо крайней мере пару способов приблизиться к этому для создания моего API

Метод 1 (работает, но очень сомневаюсь, что это хорошая практика): здесь я передаю идентификатор, полученный из mongoDB, обратно на сервер через мой файл service.tsчтобы избежать ошибки «изменение неизменяемого поля _id»

app.put("/api/posts/:id", (req,res)=>{
  console.log('update api called:', req.params.id);
  const post = new Post({
    id: req.body.id,
    title: req.body.title,
    content: req.body.content
  });

  Post.updateOne({_id: req.params.id}, post).then( result=> {
    console.log(result);
    res.json({message:"Update successful!"});
  });
});

Метод 2 Я считаю, что это более надежно, чем метод 1, но все же я не считаю его хорошей практикой:

  app.put("/api/posts/:id", (req, res)=> {
  Post.findOne(
      {_id:req.params.id},(err,post)=>{
          if(err){
              console.log('Post Not found!');
              res.json({message:"Error",error:err});
          }else{
              console.log('Found post:',post);
              post.title=req.body.title;
              post.content=req.body.content;
              post.save((err,p)=>{
                  if(err){
                      console.log('Save from update failed!');
                      res.json({message:"Error",error:err});
                  }else{
                      res.json({message:"update success",data:p});
                  }   
              })
          }
      }
  );
});

Я открыт для любых мнений в надежде, что смогу чему-то научиться у гуру Mongoose и Restful:)

1 Ответ

0 голосов
/ 16 декабря 2018

Обоснование выбора findOneAndUpdate() в этом сценарии простыми словами являются следующие:

  1. Вы можете использовать findOneAndUpdate(), поскольку он обновляет документ на основе фильтра и критериев сортировки.
  2. При работе с мангустом мы обычно предпочитаем использовать эту функцию по сравнению с update(), так как она имеет опцию {new: true} и с помощью этого мы можем получать обновленные данные.
  3. Ваша цель - обновить один документ, чтобы вы могли использовать findOneAndUpdate().С другой стороны, update() следует использовать в случае массового изменения.
  4. Поскольку update() Всегда возвращает измененный документ, он не будет возвращать обновленные документы, и при работе с таким сценарием, как ваш, мы всегдавозвращает обновленные данные документа в ответ, поэтому мы должны использовать findOneAndUpdate() здесь
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...