mongoose不保存编辑的文件

我最近开始玩Node.js,我一直在试图创build一个基本的博客(使用Express,MongoDB和Mongoose),在那里我可以创build,编辑和删除post。 我已经设法让除了编辑以外的所有东西都可以工作 这里有一个创buildpost的路线的例子,所以你可以看到我的方法。 我用CoffeeScript编写了它。 如果这是一个问题,我可以编译和编辑post。

# [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' 

以下是编辑post模板的表单:

 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,真的),我不知道现在看什么。

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

使用Document.set方法。 它会标记你的财产被修改。

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

当你给一个混合/嵌套属性赋值的时候,Mongoose不知道它被修改了; 它只能看到键入的属性。 当你保存时,Mongoose只更新它知道已被修改的属性。

为了处理这个问题,Mongoose文档提供了setModified方法来标记改变的属性。

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

当你确切地知道你正在更新什么属性并且只有一个属性的时候,这很好,但是在大多数情况下, doc.set可能是更好的select。 当你通过doc.set代表你想做的改变的对象时,你可以把它看作是对Mongoose文档进行操作的更新,而不是对数据库的实际更新。

doc.set方法将通过更新对象,并将每个属性分配给文档,正确地标记为已修改。 然后save将会成功。