【问题标题】:Mongoose isn't saving edited document猫鼬没有保存编辑过的文档
【发布时间】:2014-01-29 16:04:37
【问题描述】:

我最近开始使用 Node.js,并且一直在尝试创建一个基本博客(使用 Express、MongoDB 和 Mongoose),我可以在其中创建、编辑和删除帖子。除了编辑之外,我已经设法让一切正常。这是创建帖子的路线示例,因此您可以查看我的方法。我已经使用 CoffeeScript 编写了它。如果这是一个问题,我可以编译和编辑帖子。

# [get] new post
  app.get "/posts/new", ensureAuthenticated, (req, res) ->
    res.render "posts/new",
      title: "New Post"
      user: req.user

# [post] new post
  app.post "/posts", (req, res) ->
    post = new Post(req.body.post)
    post.save (err) ->
      unless err
        res.redirect '/posts'
      else
        res.redirect '/posts/new'

我遇到的问题是当我尝试编辑/保存帖子(文档)时。我没有看到任何错误,但数据库中的文档没有更新。我正在使用 PUT 请求,因为我读到它是由 Express 转换的。我的编辑路线如下:

# [get] edit post
  app.get "/posts/:id/edit", (req, res) ->
    Post.findById req.params.id, (err, doc) ->
      res.render 'posts/edit',
        title: 'Edit Post View'
        post: doc

# [put] edit post
  app.put "/posts/:id", (req, res) ->
    Post.findById req.params.id, (err, doc) ->
      doc.post = req.body.post.content
      doc.save (err) ->
        unless err
          res.redirect '/posts'
          console.log 'edit success'
        else
          console.log 'edit failed'

这是来自编辑帖子模板的表格:

form(method='post', action='/posts/' + post.id)
    input(name='_method', value='PUT', type='hidden')
    fieldset
        legend Editing post
        div.clearfix
            label Post
            div.input
                input(name='post[content]', class='xlarge', value="#{post.content}")
        div.actions
            input(type='submit', value='Save', class='btn primary')
            button(type='reset', class='btn') Reset

谁能帮我解决这个问题?我已经按照书中的教程进行了操作,这已经完成了,但它似乎对我不起作用。如果我看到一些错误,那将是一个开始,但由于我对 Node.js(和 JavaScript,真的)非常陌生,我现在不知道去哪里找。

感谢您的宝贵时间,非常感谢!

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    使用Document.set 方法。它会将您的属性标记为已修改。

    doc.set post:req.body.post.content
    

    【讨论】:

    • 感谢您的回复。您能否进一步解释一下,因为我是新手。从我看过的书籍/教程中,我在保存/更新已编辑的内容时遇到了 doc.save 和 doc.update 。你知道为什么我的代码没有显示任何错误但实际上没有做任何事情吗?谢谢。
    【解决方案2】:

    当您为混合/嵌套属性分配值时,Mongoose 不知道它已被修改;它只能查看输入的属性。保存时,Mongoose 只会更新它知道已修改的属性。

    为了解决这个问题,Mongoose 文档提供了setModified 方法来标记更改的属性。

    doc.post = req.body.post.content
    doc.setModified 'post'
    doc.save (err) -> ...
    

    如果您确切知道要更新的属性并且只有一个属性,那很好,但在大多数情况下,doc.set 可能是更好的选择。当您传递 doc.set 一个代表您想要进行的更改的对象时,您可以将其视为对 Mongoose 文档 进行操作的更新,而不是对数据库的实际更新。

    doc.set 方法将遍历更新对象并将每个属性分配给文档,正确地将它们标记为已修改。那么save就会成功。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2014-08-03
      • 2014-09-06
      相关资源
      最近更新 更多