寻找最佳方法来更新猫鼬

时间:2018-12-16 02:21:53

标签: node.js angular mongodb rest mongoose

总的来说,我还是猫鼬的新手。我正在构建具有基于Node和MongoDB后端的博客应用程序,我在前端使用Angular。

我正在创建我的Restful API,该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请求发送到后端服务器,此功能的ID来自后端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(有效,但高度怀疑这是否是一种好习惯): 在这里,我通过service.ts文件将从mongoDB检索到的ID传递回服务器,以避免“修改不可变字段_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});
                  }   
              })
          }
      }
  );
});

我愿意接受所有人的意见,希望我可以从猫鼬大师和Restful中学到一些东西

1 个答案:

答案 0 :(得分:1)

在这种情况下,简单地选择findOneAndUpdate()的理由如下:

  1. 您可以使用findOneAndUpdate()来更新基于以下内容的文档: 筛选和排序条件。
  2. 虽然大多数情况下都使用猫鼬,但与update()相比,我们更喜欢使用此功能,因为它有一个选项{new: true},并借助它可以获取更新的数据。
  3. 这里的目的是更新单个文档,以便您可以使用findOneAndUpdate()。另一方面,update()应该是 批量修改时使用。
  4. 由于update()总是返回修改后的文档,因此不会返回更新的文档,并且在诸如 您,我们总是会返回更新的文档数据,因此我们 应该在这里使用findOneAndUpdate()